I could not bind the model to Controller. Please give me any advice. Model,controller and view classes are below. When model is submmited, dictionary property equals to null.
public class GroupRights //model
{
public List<DtoGrup> groups { get; set; }
public Dictionary<short, Dictionary<EnFunction, bool>> groupRights { get; set; } // group function HasPermission
}
public enum EnFunction
{
LPDU_login,
LPDU_changePassword,
LPDU_transitList,
LPDU_PosEventList,
....
}
Controller
public ActionResult GroupRights()
{
TocCommonService.CommonServiceClient client = new TocCommonService.CommonServiceClient();
GroupRights gr = new GroupRights();
gr.groups = client.GetAllOperatorGroups().ToList();
gr.groupRights = new Dictionary<short, Dictionary<EnFunction, bool>>();
foreach (var g in gr.groups)
{
Dictionary<EnFunction, bool> permission = new Dictionary<EnFunction, bool>();
foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast<EnFunction>())
{
permission.Add(func, client.hasPermission(new DtoGrup() { GROUPID = g.GROUPID }, func));
}
gr.groupRights.Add(g.GROUPID, permission);
}
return View(gr);
}
View
@model TocWebApplication.Models.GroupRights
@{
int id = 0;
}
@using (Html.BeginForm("ChangePermissionOfGroup", "Home", FormMethod.Post))
{
<table>
<thead>
<tr>
<th></th>
@foreach (var gr in Model.groups)
{
<th>@gr.GROUPNAME (@gr.GROUPID)</th>
}
</tr>
</thead>
<tbody>
@foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast<EnFunction>())
{
<tr>
<td>@(func.ToString())</td>
@for (int j = 0; j < Model.groups.Count(); j++)
{
<td>@Html.CheckBoxFor(model => model.groupRights[Model.groups[j].GROUPID][func])</td>
}
</tr>
}
</tbody>
</table>
<button type="submit" class="btn btn-primary">Save changes</button>
<button class="btn">Cancel</button>
}
For all but Dictionaries where both the
Key
andValue
are simple value types (for exampleDictionary<string, bool>
), theDefaultModelBinder
requires the name/value attributes to be in the format (in your case)There are no
HtmlHelper
methods that can generate the correct attributes and to bind to yourgroupRights
you would need to generate the html manually.Instead, create a view model(s) that represents the data you want to display in the view.If I have interpreted this correctly, you want to display a table displaying each
EnFunction
value down, and eachDtoGrup
across, and to display a checkbox in each cell to determine whichEnFunction
is selected for eachDtoGrup
.And in the view
In the GET method, initialize an instance of
PermissionsVM
and populate it based on your data models and pass it to the view, for exampleand in the POST method