2016-04-14 9 views
0

Bir ASP.NET MVC uygulamasında çalışıyorum. Bu uygulamada, özel bir nesnenin üstünde bir onay kutusu listesi oluşturmak için çalışıyorum. Özel nesne şöyle görünür:ASP.NET MVC - CheckBox Listesi Kimliği, Adı ve Değeri

: şöyle ki Profili denilen bir eylem ile, o zaman bir denetleyici var

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

:

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; } 
    } 
} 

ben şöyle bir modele sahip

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

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

Bu gibi benim Jilet görünümünde benim onay kutusu seçenekleri çevirdim:

@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> 
} 

Seçenekler iyi sonuç verir. Ancak, formu kaydettiğimde, yalnızca ilk seçilen onay kutusu kimliği döndürülüyor gibi görünüyor. Bir onay kutusu listesi için HTML'mi düzgün bir şekilde nasıl oluşturduğumdan emin değilim ve b) değerlerin sunucuya düzgün bir şekilde gönderilmesini sağlayın. Blog yayınlarında başka örnekler gördüm, ancak görünümümün daha fazla HTML’si olacak. Bu nedenle, istemci tarafında "nasıl" onay kutusu değerlerinin işlendiğini anlamaya çalışıyorum ve ASP.NET MVC'de sunucuya geri gönderilmeye çalışıyorum. ayarlayıcılar ekleyin, veri geri gönderildi olmaz, böylece özellikleri için ayarlayıcılar yok İkincisi

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

:

cevap

1

Önce List<T> yerine IEnumerable<T> kullanmak için modelinde değişiklik yapmak zorunda

bu endeksleme sonrası için veri bağlama böylece
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;} 
} 

ve sonunda basitçe kesinlikle yazılı html yardımcısı kullanmak ve döngü için kullanmak gerekir:

@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> 
} 

Bu, posta kutusuna bağlanabilmeleri için doğru adlara sahip onay kutuları oluşturacaktır.

How List binding works