我正在使用View
将List<ViewModel>
返回Controller
的{{1}}操作方法。
问题:
Create
返回给控制器是否正确?我这样做的原因是我必须为每个用户多次输入数据库。 2.我的List<ViewModel>
实现是不正确的,因为我试图通过单个User对象添加数据,其中我收到了ViewModel列表,它只是单个用户的View的表示。那么控制器应该如何实现呢? Controller
方法?限制:
public ActionResult Create()
逻辑:
用户可以为每个用户选择多个复选框(代表ROLE),并且应该作为单行保存在数据库中。例如
数据库: 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逻辑
答案 0 :(得分:4)
您可以在此处向模型发送模型:
return View(viewModelList);
该模型属于List<UserViewModel>
类型。但是,根据错误,视图需要User
类型的模型。类似于视图本身的声明:
@model Project.Models.User
所以你有两个选择:
List<UserViewModel>
的模型,在视图本身中根据需要进行任何更改以使用该新模型类型。Project.Models.User
的模型(可能是List<UserViewModel>
中某个元素的转换?)。在技术级别,任一选项都完全有效。 (虽然这两者是相互排斥的,但它是一个或另一个。)由您决定哪个选项对您正在构建的系统更有意义,无论该视图是否应该运行在一个实例或一个列表上。
编辑:您对问题的编辑(包含视图)似乎表明您可能正在查看错误的视图。您向我们展示的视图与您向我们显示的错误消息不符。请记住,控制器方法的两个退出路径(重定向和视图返回)可能调用不同的视图。
无论如何,问题的核心仍然存在。在某个地方,您提供的视图的类型与预期的类型不同。您可能需要进行一些额外的调试,以确定代码中发生的 where ,但最终问题和可能的解决方案仍然与上述相同。