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

c# mvc: Persisting data from View to Controller and then via single object for List<ViewModel>

我正在使用 View return 将 List<ViewModel> 转换为 ControllerCreate 操作方法。

问题:

  1. 控制器return List<ViewModel>是否正确?我这样做的原因是我必须为每个用户在数据库中输入多行。 2. 我的 Controller 实现不正确,因为我试图通过单个用户对象添加数据,我收到了 ViewModels 列表,这只是单个用户的视图表示。那么controller应该怎么实现呢?
  2. 我需要在控制器中使用 public ActionResult Create() 方法吗?

限制:

  1. 无法更改数据库
  2. 数据库中用户或角色 table 的
  3. None 具有 int 类型 PK

逻辑:

用户将能够为每个用户select 多个复选框(代表角色),并且应该作为单行保留在数据库中。例如

DB: dbo.User table 保存时应该有以下条目

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

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

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

点击保存按钮并显示数据库中最近的更改后,用户将保持在同一页面(保存视图)。

ViewModel:

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; }
}

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

@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>

控制器:

[HttpPost]
    public ActionResult Create(List<UserViewModel> viewModelList)
    {
        for (int i= 0; i > viewModelList.Count; i++) {
            for (int j = 0; j > viewModelList[i].Roles.Count; j++) {

                    db.UserDetails.Add(new User 
                    {
                        username = viewModelList[i].UserName,
                        level = viewModelList[i].Level,
                        location = viewModelList[i].Location,
                        role = viewModelList[i].Roles[j].RoleName,
                        Approval = "",
                        Request = "",
                        Active = "Y"
                    });
            }

            db.SaveChanges();
            return RedirectToAction("Index","Users");
        }          
        return View(viewModelList); // not right
    }

错误:

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[Project.ViewModels.UserViewModel]', but this dictionary requires a model item of type 'Project.Models.User'.

任何 guidance/help 表示赞赏。

EDIT1: 视图已添加 EDIT2: 添加了业务逻辑

此处您要将模型发送到视图:

return View(viewModelList);

并且该模型的类型为 List<UserViewModel>。然而,根据错误,视图需要一个 User 类型的模型。类似于视图本身的声明:

@model Project.Models.User

所以你有两个选择:

  1. 更改视图以接受类型 List<UserViewModel> 的模型,根据需要在视图本身内进行任何更改以使用该新模型类型。
  2. 向视图发送类型为 Project.Models.User 的模型(这可能是 List<UserViewModel> 中一个元素的转换?)。

技术 级别上,任一选项都完全有效。 (虽然这两者是相互排斥的,但它是一个或另一个。)由您决定哪个选项对您正在构建的系统更有意义,无论该视图应该在实例上还是在列表上运行。


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

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