C# MVC3型号绑定器无法绑定字典<;字符串,bool>;这是我的ViewModel的一部分
我搞不清楚我搞砸了什么。C# MVC3型号绑定器无法绑定字典<;字符串,bool>;这是我的ViewModel的一部分,c#,asp.net-mvc-3,razor,dictionary,model-binding,C#,Asp.net Mvc 3,Razor,Dictionary,Model Binding,我搞不清楚我搞砸了什么。FormCollection似乎表明一切都是正确的角色名也很好地恢复了。那么为什么RoleMembership返回null 型号: public class EditRoleMembershipViewModel { public string RoleName { get; set; } public Dictionary<string, bool> RoleMembership { get; set; } } [HttpGet] publ
FormCollection
似乎表明一切都是正确的<代码>角色名也很好地恢复了。那么为什么RoleMembership
返回null
型号:
public class EditRoleMembershipViewModel
{
public string RoleName { get; set; }
public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};
var allUsers = _userServices.GetAllUsers();
getRolesForUsers(allUsers);
var role = _roleServices.GetRole(roleName);
viewModel.RoleMembership = new Dictionary<string, bool>();
foreach (var user in allUsers)
{
var isMember = user.Roles != null && user.Roles.Contains(role);
viewModel.RoleMembership.Add(user.UserName, isMember);
}
return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table>
<thead>
<tr>
<th>
</th>
<th>
In Role
</th>
</tr>
</thead>
<tbody>
@{
int index = 0;
foreach (var item in Model.RoleMembership)
{
<tr>
<td>
@item.Key
@Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
</td>
<td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
</tr>
index++;
}
}
</tbody>
</table>
<p>
<input type="submit" value="Save" />
</p>
}
<div>
@Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
公共类EditRoleMembershipViewModel
{
公共字符串RoleName{get;set;}
公共字典角色记忆{get;set;}
}
控制器动作:
public class EditRoleMembershipViewModel
{
public string RoleName { get; set; }
public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};
var allUsers = _userServices.GetAllUsers();
getRolesForUsers(allUsers);
var role = _roleServices.GetRole(roleName);
viewModel.RoleMembership = new Dictionary<string, bool>();
foreach (var user in allUsers)
{
var isMember = user.Roles != null && user.Roles.Contains(role);
viewModel.RoleMembership.Add(user.UserName, isMember);
}
return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table>
<thead>
<tr>
<th>
</th>
<th>
In Role
</th>
</tr>
</thead>
<tbody>
@{
int index = 0;
foreach (var item in Model.RoleMembership)
{
<tr>
<td>
@item.Key
@Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
</td>
<td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
</tr>
index++;
}
}
</tbody>
</table>
<p>
<input type="submit" value="Save" />
</p>
}
<div>
@Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
[HttpGet]
公共操作结果EditRoleMembership(字符串roleName)
{
var viewModel=neweditrolemembershipviewmodel{RoleName=RoleName};
var allUsers=_userServices.GetAllUsers();
getRolesForUsers(allUsers);
var role=_roleServices.GetRole(roleName);
viewModel.RoleMembership=新字典();
foreach(allUsers中的var用户)
{
var isMember=user.Roles!=null&&user.Roles.Contains(role);
viewModel.RoleMembership.Add(user.UserName,isMember);
}
返回视图(viewModel);
}
查看:
public class EditRoleMembershipViewModel
{
public string RoleName { get; set; }
public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};
var allUsers = _userServices.GetAllUsers();
getRolesForUsers(allUsers);
var role = _roleServices.GetRole(roleName);
viewModel.RoleMembership = new Dictionary<string, bool>();
foreach (var user in allUsers)
{
var isMember = user.Roles != null && user.Roles.Contains(role);
viewModel.RoleMembership.Add(user.UserName, isMember);
}
return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table>
<thead>
<tr>
<th>
</th>
<th>
In Role
</th>
</tr>
</thead>
<tbody>
@{
int index = 0;
foreach (var item in Model.RoleMembership)
{
<tr>
<td>
@item.Key
@Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
</td>
<td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
</tr>
index++;
}
}
</tbody>
</table>
<p>
<input type="submit" value="Save" />
</p>
}
<div>
@Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
ViewBag.Title=“编辑角色”;
}
@ViewBag.Title:@Model.RoleName
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
扮演
@{
int指数=0;
foreach(Model.RoleMembership中的var项)
{
@项目.关键
@Html.Hidden(string.Format(“model.RoleMembership[{0}].Key”,index),item.Key)
@CheckBox(string.Format(“model.RoleMembership[{0}].Value”,索引),item.Value)
索引++;
}
}
}
@ActionLink(“回到细节”,“RoleDetails”,新的{Model.RoleName})
能否尝试从复选框助手声明中删除“model.”前缀
而不是
<td>
@item.Key
@Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
</td>
<td>
@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)
</td>
@项目.关键
@Html.Hidden(string.Format(“model.RoleMembership[{0}].Key”,index),item.Key)
@CheckBox(string.Format(“model.RoleMembership[{0}].Value”,索引),item.Value)
这样做:
<td>
@item.Key
@Html.Hidden(string.Format("RoleMembership[{0}].Key", index), item.Key)
</td>
<td>
@Html.CheckBox(string.Format("RoleMembership[{0}].Value", index), item.Value)
</td>
@项目.关键
@隐藏(string.Format(“RoleMembership[{0}].Key”,索引),item.Key)
@CheckBox(string.Format(“RoleMembership[{0}].Value”,索引),item.Value)
我认为默认的model binder无法做到这一点。我很确定这就是序列化词典的问题,如果不做一些额外的工作,.Net是无法做到的。难以置信,这是多么简单。在这方面,按惯例编码真的会让你后悔莫及。如果我知道怎么做,如果你能给我一个关于模型绑定器的约定的资源,我很乐意给你一个奖励