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