Dizionario <abbreviazione, Dizionario > binding del modello non funziona

Non riuscivo a bind il modello a Controller. Per favore, dammi qualche consiglio Il modello, il controller e le classi di visualizzazione sono di seguito. Quando il modello è submmitato, la proprietà del dizionario è uguale a null.

public class GroupRights //model { public List groups { get; set; } public Dictionary<short, Dictionary> groupRights { get; set; } // group function HasPermission } public enum EnFunction { LPDU_login, LPDU_changePassword, LPDU_transitList, LPDU_PosEventList, .... } 

controllore

 public ActionResult GroupRights() { TocCommonService.CommonServiceClient client = new TocCommonService.CommonServiceClient(); GroupRights gr = new GroupRights(); gr.groups = client.GetAllOperatorGroups().ToList(); gr.groupRights = new Dictionary<short, Dictionary>(); foreach (var g in gr.groups) { Dictionary permission = new Dictionary(); foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast()) { permission.Add(func, client.hasPermission(new DtoGrup() { GROUPID = g.GROUPID }, func)); } gr.groupRights.Add(g.GROUPID, permission); } return View(gr); } 

vista

 @model TocWebApplication.Models.GroupRights @{ int id = 0; } @using (Html.BeginForm("ChangePermissionOfGroup", "Home", FormMethod.Post)) {  @foreach (var gr in Model.groups) {  }  @foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast()) {  @for (int j = 0; j < Model.groups.Count(); j++) {  }  } 
@gr.GROUPNAME (@gr.GROUPID)
@(func.ToString())@Html.CheckBoxFor(model => model.groupRights[Model.groups[j].GROUPID][func])
}

Per tutti tranne dizionari in cui sia la Key che il Value sono tipi di valori semplici (ad esempio Dictionary ), DefaultModelBinder richiede che gli attributi nome / valore siano nel formato (nel tuo caso)

       

Non esistono metodi HtmlHelper grado di generare gli attributi corretti e di legarsi al tuo gruppo. groupRights generare manualmente l’html.

Invece, creare un modello di visualizzazione che rappresenti i dati che si desidera visualizzare nella vista. Se l’ho interpretato correttamente, si desidera visualizzare una tabella che mostra ciascun valore di EnFunction basso e ogni DtoGrup attraverso e per visualizzare una casella di controllo in ogni cella per determinare quale EnFunction è selezionata per ciascun DtoGrup .

 public class GroupRightsVM // represents a table cell { public short GroupID { get; set; } public bool IsSelected { get; set; } } public class RightsVM // represents a table row { public RightsVM() { Groups = new List() } public EnFunction Right { get; set; } public List Groups { get; set; } // represents the cells in a row } public class PermissionsVM // Represents the table { public PermissionsVM() { Permissions = new List() } public IEnumerable Headings { get; set; } // represents the table headings public List Permissions { get; set; } // represents all rows } 

E nella vista

    @foreach(var heading in Model.Headings) { @heading }    @for(int i = 0; i < Model.Rows.Count; i++) {   @Html.HiddenFor(m => m.Permissions[i].Right) @Html.DisplayFor(m => m.Permissions[i].Right)  @for(int j = 0; j < Model.Permissions[i].Groups.Count; j++) {  @Html.HiddenFor(m => m.Permissions[i].Groups[j].GroupID) @Html.CheckboxFor(m => m.Permissions[i].Groups[j].IsSelected)  }  }  

Nel metodo GET, inizializzare un’istanza di PermissionsVM e popolarla in base ai modelli di dati e passarla alla vista, ad esempio

 var groups = client.GetAllOperatorGroups() var model = new PermissionsVM(); model.Headings = groups.Select(x => String.Format("{0} {{1})", x.GROUPNAME, x.GROUPID)); foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast()) { RightsVM r = new RightsVM(); r.Right = func; foreach (var g in groups) { GroupRightsVM gr = new GroupRightsVM(); gr.GroupID = g.GROUPID; gr.IsSelected = ... r.Groups.Add(gr); } model.Persmissions.Add(r); } return View(model); 

e nel metodo POST

 public ActionResult GroupRights(PermissionsVM model)