2012-04-02 55 views
5

ASP.Net MVC 3 Webアプリケーションを開発していますが、チェックボックスリストから値を取得する際にいくつかの問題があります。私はすでにStackoverflowに関するこの質問のほとんどを読んでいますが、まだいくつかの問題があります。ASP.Net MVC 3チェックボックスリストの値を取得する

は私がViewModelにに持って

public class ViewModelCheckBox 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public bool Checked { get; set; } 
} 

public ActionResult AssignSubSpeciality(int id) 
{ 
     //Get a list of all sub-specialities 
     var SpecialityList = _listService.GetListItemsByID(3).ToList(); 

     //Get a list of sub-specialities for the the passed in id, this is either the id of a speciality or grade 
     IList<RelationshipSpecialitySub> assignedSpecialities = _listService.GetAssignedSubSpecialities(id).ToList(); 

     var checkBoxList = new List<ViewModelCheckBox>(); 

     foreach (ListItem item in SpecialityList) 
     { 
      ViewModelCheckBox chkBox = new ViewModelCheckBox { Id = item.listItemID.ToString(), Name = item.description }; 

      //If sub-speciality exists in assignedSpecialities list, then make checkbox checked 
      foreach (var specilaity in assignedSpecialities) 
      { 
       if (specilaity.subID == item.listItemID) 
       { 
        chkBox.Checked = true; 
       } 
       else 
       { 
        chkBox.Checked = false; 
       } 
      } 

      checkBoxList.Add(chkBox); 
     } 

     ViewModelAssignSubSpeciality viewModel = new ViewModelAssignSubSpeciality(); 
     viewModel.ListItem = _listService.GetListItemByID(id); 
     viewModel.SpecialityList = checkBoxList; 

     return View(viewModel); 
    } 

コントローラのコードは上記のリストを取得している私のコントローラに続いて

public class ViewModelAssignSubSpeciality 
{ 
    public ListItem Item { get; set; } 
    public IList<ViewModelCheckBox> SpecialityList { get; set; } 
} 

上記のviewmodelを使用して別のViewModelすべての可能性のあるチェックボックスリスト項目のうち、前に選択したすべてのcのリストを取得するheckboxチェックされたオプションをtrueに設定するアイテムをリストします。

Myビューは、SpecialityListをループして各アイテムのチェックボックスを作成し、必要に応じて選択した値をtrueに設定します。

<fieldset> 
<legend>Specialities</legend> 

@foreach (var item in Model.SpecialityList) 
{ 
<input type="checkbox" id="@item.Id" name="@item.Name" value="@item.Id" @(item.Checked ? "checked" : "") /> 
<label for="@item.Id">@item.Name</label><br /> 
} 

<input type="submit" value="Save Changes" class="sepH_b" />           

私HttpPost私は

model.SpecialityList 

で選択したチェックボックスを取得しようとすると、私のコントローラのメソッドは、それは常にnullたち、しかしこの

public ActionResult AssignSubSpeciality(ViewModelAssignSubSpeciality model) 
    { 
     //delete all sub-specialities in tbl relationshipSpecialitySub for List 
     foreach (ViewModelCheckBox item in model.SpecialityList) 
     { 
       //_listService.DeleteSubSpecialityFromSpeciality(item.Id); 
     } 

     return RedirectToAction("ListItems", new { id = model.ListItem.listID }); 
    } 

のように見えます。なぜそれがViewModelCheckBoxのリストを含んでいないのかわかりません。

誰でもこの手伝いできますか?

ありがとうございます。

答えて

13

私は、ページ上に表示するために、エディタのテンプレートを使用し

public class CheckBoxItem 
{ 
    public string Code { get; set; } 
    public bool IsChecked { get; set; } 
    public string Label {get;set;} 
} 

私の見解モデルにこれらの列挙を持っています。

<p class="checkbox" style="display:inline"> 
<span style="margin-left:5px;"> 
    @Html.HiddenFor(x => x.Code)   
    @Html.CheckBoxFor(x => x.IsChecked) 
</span> 
@Html.LabelFor(x => x.IsChecked, Model.Label) 
</p> 

ビューでは、次のように表示してページに表示します。

@Html.EditorFor(m => m.MyEnumerableOfCheckBoxItem) 

フォームがポストバックされると、モデルは正しくバインドされます。

これが役に立ちます。

+0

+1ビューモデルとエディタテンプレートの場合+1。 –

+0

偉大な答え。ありがとうございました。 – tgriffiths

+0

興味深いことに、私はしばらくこのようなものを探していました。ありがとう。 –

0

チェックボックスに@item.Nameという名前を付けたからです。モデルのバインダーは、モデルの特定のプロパティにマップできるかどうかを確認しますが、プロパティの値ではなく、@item.Nameの値を探しているため、モデルバインダーが見つからない場合があります。

Phil Haackには、リストへのモデルバインディングについての素晴らしい記事があります。私はそれをチェックすることをお勧めします。

また、入ってくるチェックボックスの値が単なる文字列であるため、カスタムオブジェクトにバインドすることはできません。モデルには、チェックボックスの値がモデルバインドされているIEnumerable型の別のプロパティを作成する必要があります。

public IList<ViewModelCheckBox> SpecialityList { get; set; } 
public IEnumerable<string> SpecialityListValues { get; set; } 

この方法では、ビュー内の値を埋めるためにSpecialityListを使用することができ、かつSpecialityListValuesは値を取得するために:それは次のようになります。チェックボックスの名前はSpecialityListValuesに対応する必要があります。

関連する問題