DropDownListFor在发布表单后抛出错误

时间:2014-12-31 00:00:42

标签: c# asp.net asp.net-mvc

为什么我不能让它工作?

控制器:

List<SelectListItem> list = new List<SelectListItem>() {
new SelectListItem(){ Value="1", Text="Bohuslän"},
new SelectListItem(){ Value="2", Text="Dalarna"},
new SelectListItem(){ Value="3", Text="Dalsland"}
};

SelectList surbs = new SelectList(list, "Value", "Text");
ViewBag.Dropdown = surbs;
return view();

使用viewmodel

public class CreateViewModel
{
    public int SelectedId { get; set; }
    public Add Add { get; set; }
}

查看:

@Html.DropDownListFor(model => model.SelectedId, (SelectList)ViewBag.Dropdown)

发布到控制器

public ActionResult Create(CreateViewModel adds)
{
    if (ModelState.IsValid)
    {
        Add add = new Add();


错误:

  

具有键'SelectedId'的ViewData项的类型为'System.Int32',但必须是'IEnumerable'类型。

1 个答案:

答案 0 :(得分:2)

您的问题是,在回发后,ViewBag.Dropdown的值不会保留,其值为Null,因此会抛出此错误。在HTTP POST方法中再次设置ViewBag中的数据,如下所示: -

public ActionResult Create(CreateViewModel adds)
    {
        if (ModelState.IsValid)
        {
            Add add = new Add();
            ------

   List<SelectListItem> list = new List<SelectListItem>() {
     new SelectListItem(){ Value="1", Text="Bohuslän"},
     new SelectListItem(){ Value="2", Text="Dalarna"},
     new SelectListItem(){ Value="3", Text="Dalsland"}
                                                        };
   SelectList surbs = new SelectList(list, "Value", "Text");
   ViewBag.Dropdown = surbs;
   return View();

您可以将其包装在方法中以避免代码重复。

或者我认为最好的方法不是在ViewBag中传递数据,而是在ViewModel中添加SelectList属性,然后传递这样的内容: -

更新了ViewModel: -

public class CreateViewModel
{
    public int SelectedId { get; set; }
    public string Add { get; set; }
    public SelectList SurbsList { get; set; }
}

对于Get和&amp;发布请求,将SurbsList绑定到这样: -

adds.SurbsList = GetSurbs();

其中,GetSurbs()是一种方法: -

private SelectList GetSurbs()
{
    List<SelectListItem> list = new List<SelectListItem>() 
                  {
                     new SelectListItem(){ Value="1", Text="Bohuslän"},
                     new SelectListItem(){ Value="2", Text="Dalarna"},
                     new SelectListItem(){ Value="3", Text="Dalsland"}
                  };
          return new SelectList(list, "Value", "Text");
}

最后像这样绑定你的下拉列表: -

@Html.DropDownListFor(model => model.SelectedId, Model.SurbsList)