c#mvc:将数据从View保存到Controller,然后通过List <viewmodel>的单个对象

时间:2016-10-19 12:07:52

标签: c# asp.net-mvc-4 model-view-controller mvvm asp.net-mvc-viewmodel

我正在使用ViewList<ViewModel>返回Controller的{​​{1}}操作方法。

问题:

  1. Create返回给控制器是否正确?我这样做的原因是我必须为每个用户多次输入数据库。 2.我的List<ViewModel>实现是不正确的,因为我试图通过单个User对象添加数据,其中我收到了ViewModel列表,它只是单个用户的View的表示。那么控制器应该如何实现呢?
  2. 我是否需要在控制器中使用Controller方法?
  3. 限制:

    1. 无法更改数据库
    2. 数据库中的User或Role表都没有int类型public ActionResult Create()
    3. 逻辑:

      用户可以为每个用户选择多个复选框(代表ROLE),并且应该作为单行保存在数据库中。例如

      enter image description here

      数据库: dbo.User表在保存

      时应具有以下条目

      (abcdefg,levelA,locationB,Role2,null,null,Y)

      (msjdhcdu,levelA,locationB,Role2,null,null,Y)相同用户不同角色

      (msjdhcdu,levelA,locationB,Role3,null,null,Y)相同用户不同角色

      在“保存”按钮单击并显示数据库中的最近更改后,USer将保留在同一页面(保存VIEW)。

      视图模型:

      PK

      查看:我可能在VIEW中做了一些非常错误的事情

      public class UserViewModel
      {
          public string UserName { get; set; }
          public string Level { get; set; }
          public string Location { get; set; }
          public List<RoleViewModel> Roles { get; set; }
      }
      
      public class RoleViewModel
      {
          public string RoleName{ get; set; }
          public bool IsSelected { get; set; }
      }
      

      控制器:

      @model List<Project.ViewModels.UserViewModel>
      
      @using (@Html.BeginForm("Create", "User", FormMethod.Post ,new { id = "UserPermissionForm" }))
      
      
      {
      <table class="table">
          <tr>
              <th>User</th>
              @for (int i = 0; i < Model[0].Roles.Count; i++)
              {
                  <th>
                      @Model[0].Roles[i].RoleName
                  </th>
              }
          </tr>
          @for (int i = 0; i < Model.Count; i++)
          {
              <tr>
                  <td>
                      @Html.HiddenFor(m => m[i].UserName)
                      @Model[i].UserName
                  </td>
                  @for (int j = 0; j < Model[i].Roles.Count; j++)
                  {
                      <td>
                          @Html.CheckBoxFor(m => m[i].Roles[j].IsSelected)
                      </td>
                  }
              </tr>
          }
      </table>
      
      <div class="form-actions">
              <button type="submit" class="btn btn-success submit" value="Save">Save changes</button>
          </div>
      
      <script>
          $('#Submit').click(function () {
              let url = '@Url.Action("Create", "Users")'
              $.post(url, $("#UserPermissionForm"))
              });
      </script>
      

      错误:

        

      传递到字典中的模型项的类型为&#39; System.Collections.Generic.List`1 [Project.ViewModels.UserViewModel]&#39;,但此字典需要类型为&#39的模型项; Project.Models.User&#39;

      感谢任何指导/帮助。

      EDIT1:已添加视图 EDIT2:添加了Bsuiness逻辑

1 个答案:

答案 0 :(得分:4)

您可以在此处向模型发送模型:

return View(viewModelList);

该模型属于List<UserViewModel>类型。但是,根据错误,视图需要User类型的模型。类似于视图本身的声明:

@model Project.Models.User

所以你有两个选择:

  1. 更改视图以接受类型List<UserViewModel>的模型,在视图本身中根据需要进行任何更改以使用该新模型类型。
  2. 向视图发送类型Project.Models.User的模型(可能是List<UserViewModel>中某个元素的转换?)。
  3. 技术级别,任一选项都完全有效。 (虽然这两者是相互排斥的,但它是一个或另一个。)由您决定哪个选项对您正在构建的系统更有意义,无论该视图是否应该运行在一个实例或一个列表上。

    编辑:您对问题的编辑(包含视图)似乎表明您可能正在查看错误的视图。您向我们展示的视图与您向我们显示的错误消息不符。请记住,控制器方法的两个退出路径(重定向和视图返回)可能调用不同的视图。

    无论如何,问题的核心仍然存在。在某个地方,您提供的视图的类型与预期的类型不同。您可能需要进行一些额外的调试,以确定代码中发生的 where ,但最终问题和可能的解决方案仍然与上述相同。