2016-04-14 18 views
0

私はASP.NET MVCアプリケーションで作業しています。このアプリケーションでは、私はカスタムオブジェクトの上にチェックボックスのリストを作成しようとしています。カスタムオブジェクトは、次のようになります。ASP.NET MVC - チェックボックスのリストID、名前、および値

:このように見えること、プロファイルと呼ばれるアクションで、私は、コントローラを持って

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

私はこのようになりますモデルを持っています

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

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

私はこのように私のかみそりビューで私のチェックボックスオプションをレンダリングしています:

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

オプションがうまく表示されます。しかし、フォームを保存すると、最初に選択されたチェックボックスIDだけが返されるように見えます。私はどのようにa)適切にチェックボックスリストのHTMLをレンダリングし、b)適切にサーバーにポストバックするための値を取得するか分からない。私はブログ記事で他の例を見たことがありますが、私の見解ではかなり多くのHTMLがあります。そのため、私はチェックボックスの値がクライアント側でレンダリングされ、ASP.NET MVCのサーバーにポストバックされる方法を把握しようとしています。

答えて

1

まずあなたの代わりにIEnumerable<T>List<T>を使用するようにモデルの変更を行う必要があります:

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

データはセッターを追加し、戻って掲載されないように、第二に、あなたは、あなたの特性のためのセッターを持っていない。

そのインデックスは、ポストのためにデータをバインドすることができるように
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;} 
} 

と最後の あなたは単に強く型付けされたHTMLヘルパーを使用して、forループを使用する必要があります。

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

これにより、正しい名前のチェックボックスが作成され、投稿にバインドできるようになります。

How List binding works

関連する問題