2011-09-18 40 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); 
} 
相关问题