2016-04-14 6 views
0

Ich arbeite an einer ASP.NET MVC App. In dieser App arbeite ich daran, eine Checkbox-Liste über einem benutzerdefinierten Objekt zu erstellen. Das benutzerdefinierte Objekt sieht wie folgt aus:ASP.NET MVC - CheckBox List ID, Name und Wert

public class ListItem<TId, TLabel, TIsChecked> 
{ 
    private TId id; 
    private TLabel label; 
    private TIsChecked isChecked; 

    public ListItem(TId id, TLabel label, TIsChecked isChecked) 
    { 
     this.id = id; 
     this.label = label; 
     this.isChecked = isChecked; 
    } 

    public TId Id 
    { 
     get { return id; } 
    } 

    public TLabel Label 
    { 
     get { return label; } 
    } 

    public TIsChecked IsChecked 
    { 
     get { return isChecked; } 
    } 
} 

ich ein Modell, das wie folgt aussieht:

public class MyModel 
{ 
    public IEnumerable<ListItem<Guid, string, bool>> Options { get; set; } 
} 

ich dann einen Controller haben, mit einer Aktion namens Profil, das wie folgt aussieht:

[HttpGet] 
public ActionResult Profile() 
{ 
    var model = new MyModel(); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Profile(MyModel model) 
{ 
    return View(model); 
} 

ich bin Rendering meine Checkbox Optionen in meinem Razor Ansicht wie folgt aus:

@foreach (var option in Model.Options) 
{ 
    <div class="form-group"> 
    <div class="checkbox"> 
    <label> 
    <input name="Options" value="@option.Id" type="checkbox" @((option.IsChecked == true) ? "checked" : string.Empty)>&nbsp;@option.Label 
    </label> 
    </div> 
</div> 
} 

Die Optionen werden in Ordnung wiedergegeben. Aber wenn ich das Formular speichere, sieht es so aus, als ob nur die erste ausgewählte Checkbox-ID zurückgegeben wird. Ich bin mir nicht sicher, wie ich meinen HTML-Code richtig für eine Checkbox-Liste rendern und b) die Werte korrekt auf den Server zurück posten soll. Ich habe andere Beispiele in Blogposts gesehen, aber meine Ansicht wird deutlich mehr HTML enthalten. Aus diesem Grund versuche ich herauszufinden, wie Checkbox-Werte auf der Clientseite gerendert und in ASP.NET MVC an den Server zurückgeschickt werden.

Antwort

1

Zuerst müssen Sie in Ihrem Modell tun Änderung List<T> zu verwenden, anstatt IEnumerable<T>:

public List<ListItem<Guid, string, bool>> Options { get; set; } 

Zweitens haben Sie nicht Setter für Ihre Eigenschaften, so dass die Daten nicht wieder Setter gebucht werden, fügen:

public TId Id 
{ 
    get { return id; } 
    set { id = value;} 
} 

public TLabel Label 
{ 
    get { return label; } 
    set { label = value;} 
} 

public TIsChecked IsChecked 
{ 
    get { return isChecked; } 
    set { isChecked = value;} 
} 

und schließlich müssen Sie einfach stark typisierte html Helfer verwenden und für Schleife verwenden, so dass Indizierungsdaten für Post binden können:

@for(int i=0; i< Model.Options.Count; i++) 
{ 
    <div class="form-group"> 
    <div class="checkbox"> 
    <label> 
    @Html.CheckBoxFor(model => model.Options[i].IsChecked)&nbsp;@Model.Options[i].Label 
    </label> 
    @Html.HiddenFor(model=> model.Options[i].Id) 
    @Html.HiddenFor(model=> model.Options[i].Label) 
    </div> 
</div> 
} 

Dadurch werden Kontrollkästchen mit korrekten Namen erstellt, so dass sie beim Post gebunden werden können.

Sie möchten vielleicht einen Blick auf How List binding works

werfen