通过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模型集来强烈绑定单个记录视图?

通过IEnumerable< model>单一模型到同一视图

选项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只包含您需要的属性将是更好的方法,特别是对于客户端和服务器端验证和防止过度发布攻击

一种简单的方法是使用包装器模型来显示记录,同时使用该模型来添加新记录。就像

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

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

你实现了一个局部视图,你有你的模型添加新的,只是渲染到显示视图?然后,您也可以将此视图仅用于其实际用途!

你可以创建一个带有@model UserDetailViewModel的局部视图然后在你的主视图中你只需调用

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

在你的局部视图中,你有你的标准帮助器。