2011-09-18 46 views
3

我單擊保存時出現以下錯誤:asp.net mvc 3 Dropdownlist問題,必須是'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); 
} 
相關問題