2016-09-30 5 views
0

ich die folgende Ansicht Modell haben:Warum gibt meine MultiSelectList keine Daten an das Modell zurück?

public class SendGroupEmailViewModel 
{ 
    public int EmailID { get; set; } 
    public IEnumerable<SelectListItem> Roles { get; set; } 
    public int[] SelectedRoles { get; set; } 

} 

Die Aktion-Controller, der die entsprechenden Informationen zu der Ansicht sendet:

var viewModel = new SendGroupEmailViewModel 
     { 
      Roles = db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(), 

     }; 

Dann meiner Ansicht nach:

@Html.ListBoxFor(model => model.SelectedRoles, new MultiSelectList(Model.Roles, "Value", "Text"), new { @class = "" }) 

Die Liste erscheint korrekt in der Ansicht, aber wenn das Formular mit dem obigen ListBoxFor in gepostet wird, wird SelectedRoles als Null zurückgegeben.

Kann mir jemand sagen, warum das ist und wie ich es beheben kann?

+1

Was ist der Typ der Id-Eigenschaft in Rollenentität? – Shyju

+0

Es ist ein String, vielen Dank für das Hinweis auf mein Problem, ich fühle mich ziemlich dumm! Bearbeiten - Das hat mein Problem offensichtlich gelöst. – Rob

Antwort

1

Ihr Code sieht gut aus. Der einzige Grund, warum dies nicht funktioniert, ist, dass der Optionswert des SELECT-Elements kein numerischer Typ ist (Beispiel: Guid/String). In diesem Fall kann der Modellbinder das Array nicht-numerischer Werte nicht an einen Array-Typ int binden (welcher der Typ Ihrer SelectedRoles-Eigenschaft ist).

Die Lösung besteht darin, den Typ SelectedRoles in eine Sammlung von Typ zu ändern, der der Typ Ihrer Id -Eigenschaft in Role Einheit ist.

Angenommen, Ihre Role.Id von string Typ ist, sollte dies das Problem beheben

public class SendGroupEmailViewModel 
{ 
    public int EmailID { get; set; } 
    public IEnumerable<SelectListItem> Roles { get; set; } 
    public string [] SelectedRoles { get; set; } 
} 

Auch brauchen Sie nicht wieder ein Objekt von MultiSelectList in Ihrer Ansicht zu erstellen. Sie können einfach tun

@Html.ListBoxFor(model => model.SelectedRoles, Model.Roles, new { @class = "" }) 
Verwandte Themen