所以我有一个名为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 ,这将在包含所有modal
的同一视图中切换inputs
以接受详细信息和某些字段模型的属性。以下是模型包含的内容:
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
模型集来强烈绑定单个记录视图?
答案 0 :(得分:3)
一种简单的方法是使用包装器模型来包含您的集合以显示您的记录,同时使用模型来添加新记录。所以喜欢
class Wrapper
{
public IEnumerable<CollectionModel> Records {get; set;}
public AddNewModel AddNew { get; set;}
}
然而,这不是一个好的解决方案,因为你的模型有两个责任。
如果您在模型中添加new并将其渲染到显示视图中,您实现的局部视图怎么样?那么你也可以将这个视图重用于它的实际目的!
答案 1 :(得分:3)
选项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
只包含您需要的属性将是一种更好的方法,特别是对于客户端和服务器端验证以及防止过度发布攻击
答案 2 :(得分:0)
您可以创建一个@model UserDetailViewModel
的局部视图,然后在主视图中调用
@Hmtl.Partial("_UserDetailView", new UserDetailViewModel())
在您的部分视图中,您有标准助手..