通过IEnumerable< model>单一模型到同一视图
本文关键字:视图 模型 单一 IEnumerable model 通过 | 更新日期: 2023-09-27 18:10:18
所以我有这个名为Employee的视图,我将IEnumerable<model>
传递给视图以显示视图中的一组记录,如下所示:
@model IEnumerable<Direct_Commercial_Van.Models.DCVViewModel.UserDetailViewModel>
@{
var acc_status = "";
}
<table class="table table-striped table-bordered table-hover" id="employeeTable">
<thead>
<tr>
<th></th>
<th>Full Name</th>
<th>Account Status</th>
<th>Created by</th>
<th>Rights</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
if (item.account_status)
{
acc_status = "Active";
}
else
{
acc_status = "Inactive";
}
<tr class="odd gradeX" data-uname="User name_@item.username" data-accountlocked="Account locked_@item.account_lock" data-role="Role_@item.role" data-createdate="Created date_@item.created_date" data-uid="@item.e_Id" data-accessrights="Access rights_@item.access_rights" data-accountstatus="Account Status_@acc_status">
<td></td>
<td>@item.first_name @item.last_name</td>
<td>@item.email</td>
<td>@item.created_by</td>
<td>@Convert.ToDateTime(item.last_login).ToString("MM/dd/yyyy")</td>
<td class="setpos"></td>
</tr>
}
</tbody>
</table>
在此之前一切都很好。现在我在同一视图中有一个按钮,它是AddNew,这将在包含所有inputs
的同一视图中切换modal
,以接受模型的一些属性的详细信息和字段。下面是模型包含的内容:
public class UserDetailViewModel
{
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
public string email { get; set; }
public string last_login { get; set; }
public string created_by { get; set; }
public string created_date { get; set; }
public string role { get; set; }
public bool account_lock { get; set; }
public string access_rights { get; set; }
public bool account_status { get; set; }
public string e_Id { get; set; }
}
所以我这里的问题是,我想强烈绑定视图inputs
添加新的记录,与模型属性,但因为我收到它作为IEnumerable<model>
我只是不能使用@Html.TextBoxFor(m=>m.first_name)
等,强烈绑定它。实现这一目标的最佳方式是什么?我们如何强烈使用IEnumerable
模型集来强烈绑定单个记录视图?
选项1
为@model UserDetailViewModel
创建一个局部视图,并使用@Html.Partial("_UserDetailView", new UserDetailViewModel())
(或@{ Html.RenderPartial(..); }
)来呈现模态表单的内容
选项2
创建一个仅用于返回创建新用户的部分的子操作方法
[ChildActionOnly]
public AtionResult NewUser()
{
return PartialView(new UserDetailViewModel());
}
,并在视图中使用@Html.Action("NewUser")
(或@{ Html.RenderAction(..); }
)来呈现模态表单
选项3
如果你想推迟呈现模型表单内容,直到需要时,使用ajax调用一个控制器方法,该方法返回新用户的部分并更新模态的内容(如果使用客户端验证,则需要重新解析验证器)。
选项4
创建一个包含IEnumerable<UserDetailViewModel>
和UserDetailViewModel
属性的视图模型,但是这将迫使您在POST方法上使用[Bind(Prefix = "..")]
(或者传递视图中使用的主视图模型)
旁注:您的UserDetailViewModel
包含许多属性,这些属性似乎不适合创建新用户(例如created_by
和created_date
),这些属性应该只在您保存相关数据模型之前立即在控制器POST方法中设置,因此单独的CreateUserViewModel
只包含您需要的属性将是更好的方法,特别是对于客户端和服务器端验证和防止过度发布攻击
一种简单的方法是使用包装器模型来显示记录,同时使用该模型来添加新记录。就像
class Wrapper
{
public IEnumerable<CollectionModel> Records {get; set;}
public AddNewModel AddNew { get; set;}
}
然而,这不是一个好的解决方案,因为你的模型有两个责任。
你实现了一个局部视图,你有你的模型添加新的,只是渲染到显示视图?然后,您也可以将此视图仅用于其实际用途!
你可以创建一个带有@model UserDetailViewModel
的局部视图然后在你的主视图中你只需调用
@Hmtl.Partial("_UserDetailView", new UserDetailViewModel())
在你的局部视图中,你有你的标准帮助器。