Asp.net mvc 4 如何为具有列表的ViewModel创建编辑视图
我是MVC的新手,所以我肯定我做错了什么。我正在尽我最大的努力以MVC的方式完成它,而不是回到仅仅手工制作HTML的方式 这是我的编辑视图Asp.net mvc 4 如何为具有列表的ViewModel创建编辑视图,asp.net-mvc-4,Asp.net Mvc 4,我是MVC的新手,所以我肯定我做错了什么。我正在尽我最大的努力以MVC的方式完成它,而不是回到仅仅手工制作HTML的方式 这是我的编辑视图 @model NotesBoard.Models.RoleViewModel @{ ViewBag.Title = "Edit"; } <h2>Edit</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset>
@model NotesBoard.Models.RoleViewModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>RoleViewModel</legend>
@Html.HiddenFor(model => model.Role.Name)
<div class="editor-label">
@Html.LabelFor(model => model.Role.Name)
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.Role.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Role.Users)
</div>
<div class="editor-field">
<table>
<tr>
<td class="remove-td">Tick to Remove</td>
<td></td>
<td class="add-td">Tick to Add</td>
</tr>
<tr>
<td style="vertical-align:top; margin: 0px;">
<table style="margin: 0px;">
@foreach (var item in Model.Role.Users)
{
<tr>
<td class="remove-td">
@Html.CheckBoxFor(modelItem => item.State)
</td>
<td>
@Html.DisplayFor(modelItem => item.User)
</td>
</tr>
}
</table>
</td>
<td></td>
<td style="vertical-align:top; margin:0px;">
<table style="margin: 0px;">
@foreach (var item in Model.Users)
{
Boolean RoleUser = Model.Role.Users.Exists(model => model.User == item.User);
<tr>
@if(RoleUser)
{
<td class="add-td">
@Html.CheckBoxFor(modelItem => item.State, new { disabled=true })
</td>
<td class="disabled-label">
@Html.DisplayFor(modelItem => item.User)
</td>
}
else
{
<td class="add-td">
@Html.CheckBoxFor(modelItem => item.State, new { id=item.User })
</td>
<td>
@Html.DisplayFor(midelItem => item.User)
</td>
}
</tr>
}
</table>
</td>
</tr>
</table>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
如果我尝试使用Request.form集合直接提取数据,则所有复选框都命名为“item.state”。我应该如何实现此视图以返回下降数据,而不恢复到基本上只是自己在平面旧HTML中手工制作表单?将列表上的
foreach
更改为FOR
循环,以便索引可以在lamda中使用,并由Razor视图正确呈现:
@for (int i = 0; i < Model.Users.Count(); i++) {
{
<tr>
@if(RoleUser)
{
<td class="add-td">
@Html.CheckBoxFor(modelItem => Model.Users[i].State, new { disabled = true })
</td>
<td class="disabled-label">
@Html.DisplayFor(modelItem => Model.Users[i].User)
</td>
...
...
@for(int i=0;iModel.Users[i].State,new{disabled=true})
@DisplayFor(modelItem=>Model.Users[i].User)
...
...
然后,模型绑定器将数据正确绑定到列表
请查看此答案:效果非常好。我要补充的是,我必须确保我必须向AccountUserViewModel类添加Parameters构造函数,并为Id和用户字段添加隐藏字段,否则您只需返回索引,这在我看来是不可靠的。谢谢
[HttpPost]
[Authorize(Roles = "Admin")]
public ActionResult Edit(RoleViewModel model)
{
if (ModelState.IsValid)
{
var data = Request.Form;
return RedirectToAction("Index");
}
return View(model);
}
@for (int i = 0; i < Model.Users.Count(); i++) {
{
<tr>
@if(RoleUser)
{
<td class="add-td">
@Html.CheckBoxFor(modelItem => Model.Users[i].State, new { disabled = true })
</td>
<td class="disabled-label">
@Html.DisplayFor(modelItem => Model.Users[i].User)
</td>
...
...