2011-09-18 15 views
3

保存をクリックしたときに次のエラーが発生しました。asp.net mvc 3ドロップダウンリストの問題は、 'IEnumerable <SelectListItem>'タイプである必要がありますか?

キー 'SelectedCategoryId'を持つViewDataアイテムは 'System.Int32'タイプですが、 'IEnumerable'タイプである必要がありますか?

私のコントローラ:

public ActionResult IndexTwee() 
    { 

     var listCategories = new List<SelectListItem>(); 

     listCategories.Add(new SelectListItem() {Text="foo",Value="1" }); 
     listCategories.Add(new SelectListItem() { Text = "bar", Value = "2" }); 

     MyViewModelTwee model = new MyViewModelTwee() { }; 

     model.Categories = listCategories; 
     model.SelectedCategoryId = 2; 

     return View(model); 
    } 


    [HttpPost] 
    public ActionResult IndexTwee(MyViewModelTwee Model) 
    { 

     return View(Model); 

    } 

私のモデル:

public class MyViewModelTwee 
{ 
    public int SelectedCategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

私の見解:

@model mvc3DropDown.Models.MyViewModelTwee 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(
    x => x.SelectedCategoryId, 
    Model.Categories 
) 
    <button>Save</button> 

} 

答えて

2

があなたのPOSTアクションでリストを再バインドすることを忘れないでください:

[HttpPost] 
public ActionResult Index(MyViewModelTwee Model) 
{ 
    var listCategories = new List<SelectListItem>(); 
    listCategories.Add(new SelectListItem() { Text = "foo", Value = "1" }); 
    listCategories.Add(new SelectListItem() { Text = "bar", Value = "2" }); 
    Model.Categories = listCategories; 
    return View(Model); 
} 

htmlの<form>を送信すると、選択した値のみが送信されます。他の値は失われているので、GETアクションでそれらをフェッチした場所からそれらを再取得する必要があります。もちろん、このコードをリポジトリレイヤに外部化すると、コードは次のようになります。

public ActionResult IndexTwee() 
{ 
    var model = new MyViewModelTwee 
    { 
     SelectedCategoryId = 2, 
     Categories = _repository.GetCategories() 
    }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult IndexTwee(MyViewModelTwee Model) 
{ 
    Model.Categories = _repository.GetCategories(); 
    return View(Model); 
}