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

时间:2015-08-29 19:21:51

标签: c# asp.net-mvc asp.net-mvc-4

所以我有一个名为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模型集来强烈绑定单个记录视图?

3 个答案:

答案 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_bycreated_date),这些属性只应在控制器POST方法中设置在您保存关联数据模型之前,所以单独的CreateUserViewModel只包含您需要的属性将是一种更好的方法,特别是对于客户端和服务器端验证以及防止过度发布攻击

答案 2 :(得分:0)

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

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

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