将IEnumerable 和单个模型传递给同一视图

所以我有一个名为Employee的视图,我在其中传递IEnumerable来查看以在视图中显示一组记录,如下所示:

 @model IEnumerable @{ var acc_status = ""; }  @foreach (var item in Model) { if (item.account_status) { acc_status = "Active"; } else { acc_status = "Inactive"; }  } 
Full Name Account Status Created by Rights Actions
@item.first_name @item.last_name @item.email @item.created_by @Convert.ToDateTime(item.last_login).ToString("MM/dd/yyyy")

直到这一切都很好。 现在我在同一视图中有一个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以添加新的Record,带有模型属性,但因为我收到它作为IEnumerable我就是不能使用@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调用控制器方法,该方法返回新用户的部分并更新模式的内容(如果使用客户端validation,则需要重新解析validation器)。

选项4

创建包含IEnumerableUserDetailViewModel属性的视图模型,但这会强制您在POST方法上使用[Bind(Prefix = "..")] (或传回视图中使用的主视图模型)

附注:您的UserDetailViewModel包含许多不适合创建新用户的属性(例如created_bycreated_date ),这些属性只应在保存关联数据模型之前立即在控制器POST方法中设置,因此单独的CreateUserViewModel仅包含您需要的属性将是一种更好的方法,特别是对于客户端和服务器端validation以及防止过度发布攻击

一种简单的方法是使用包装器模型来包含您的集合以显示您的记录,同时使用模型来添加新记录。 所以喜欢

 class Wrapper { public IEnumerable Records {get; set;} public AddNewModel AddNew { get; set;} } 

然而,这不是一个好的解决方案,因为你的模型有两个责任。

如果您在模型中添加new并将其渲染到显示视图中,您实现的局部视图怎么样? 那么你也可以重用这个视图来实现它的实际目的!

您可以在主视图中创建一个具有@model UserDetailViewModel的局部视图,然后调用

 @Hmtl.Partial("_UserDetailView", new UserDetailViewModel()) 

在您的局部视图中,您有标准助手..