我的MVC5 Web应用程序中有一个管理页面,其中选择了一个用户,单击“继续”按钮后,将显示带有复选框的所有角色的列表(通过Ajax)。如果用户处于以下任何角色,则会自动选中该复选框。
一旦用户检查/取消选中每个角色的框,我想在我的HttpPost方法中传递一个List。但是,我的action方法的参数为null,但Request.Form中有值。
我不明白为什么会这样。我是否真的需要为我的viewmodel中的每个参数使用@Html.HiddenFor()
才能使事情正常工作?
RoleCheckBoxViewModel
public class RoleCheckBoxViewModel
{
[Display(Name = "Choose Role(s)")]
[Key]
public string RoleId { get; set; }
public string UserId { get; set; }
public string Name { get; set; }
[Display(Name="boxes")]
public bool IsChecked { get; set; }
}
RolesController Action
[HttpPost]
public ActionResult Update(List<RoleCheckBoxViewModel> list) //the model in my view is a List<RoleCheckBoxViewModel> so then why is it null?
{
//these next two lines are so that I can get to the AddToRole UserManagerExtension
var userStore = new UserStore<ApplicationUser>(_context);
var userManager = new UserManager<ApplicationUser>(userStore);
foreach (var item in Request.Form) //it's messy but I can see the data in this Form
{
System.Console.WriteLine(item.ToString());
}
//AddToRole for any new checkboxes checked
//RemoveFromRole any new checkboxes unchecked
//context save changes
return RedirectToAction("Index");
}
AllRoles部分视图(以前的AJAX调用的结果)
@model List<Core.ViewModels.RoleCheckBoxViewModel>
@using (Html.BeginForm("Update", "Roles", FormMethod.Post))
{
<p>
Select Roles
</p>
<table class="table">
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(model => item.Name)
@Html.CheckBoxFor(model => item.IsChecked)
</td>
</tr>
@Html.HiddenFor(model => item.RoleId)
@Html.HiddenFor(model => item.UserId)
@Html.HiddenFor(model => item.IsChecked)
@Html.HiddenFor(model => item.Name)
}
</table>
<input type="submit" value="Save" class="glyphicon glyphicon-floppy-save" />
}
答案 0 :(得分:1)
如果是集合,模型绑定器需要对输入控件的名称进行索引,以在控制器操作中作为集合发布。您可以将循环更改为使用for循环,并在辅助方法中进行索引,是的,如果您不希望用户编辑它们,则需要为要发布的属性创建隐藏输入。
您可以将循环代码更改为以下内容以正确发布模型:
@for(int i=0; i < Model.Count' i++)
{
<tr>
<td>
@Html.DisplayFor(model => Model[i].Name)
@Html.CheckBoxFor(model => Model[i].IsChecked)
</td>
</tr>
@Html.HiddenFor(model => Model[i].RoleId)
@Html.HiddenFor(model => Model[i].UserId)
@Html.HiddenFor(model => Model[i].IsChecked)
@Html.HiddenFor(model => Model[i].Name)
}
希望它有所帮助!