DropDownListFor问题

时间:2013-04-07 00:25:20

标签: asp.net-mvc-3

我有一个返回列表项的方法。当我尝试使用此项填充DropDownList时出现问题。我每次都得到一个null异常。捕获的地方在哪里?

方法:

public IEnumerable<SelectListItem> GetItems()
    {
        List<SelectListItem> list = new List<SelectListItem>();

        list.Add(new SelectListItem { Text = "Ptuj", Value = "1" });
        list.Add(new SelectListItem { Text = "Celje", Value = "2" });
        list.Add(new SelectListItem { Text = "Laško", Value = "3" });
        list.Add(new SelectListItem { Text = "Maribor", Value = "4" });
        list.Add(new SelectListItem { Text = "Ljubljana", Value = "5" });
        list.Add(new SelectListItem { Text = "N/A", Value = "6" });


        foreach (SelectListItem item in list)
        {
            yield return item;
        }
    }

查看:

@Html.LabelFor(model => model.PlaceOfBirth)
        @Html.DropDownListFor(model => model.PlaceOfBirth, //Exception thrown in this line
        Model.GetItems())

2 个答案:

答案 0 :(得分:0)

我会将该List更改为SelectList。您已经在使用SelectListItems了,所以您也可以使用SelectList。

然后,返回SelectList。您可以将签名返回类型保留为IEnumerable,因为SelectList类实现了该接口(好吧,无论如何,它都是父类)。

让我举一个例子。这是一个模型:

public class AModel
{
    public IEnumerable<SelectListItem> places { get; set; }
    public int SelectedValue { get; set; }
}

这是一个索引操作方法:

public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    AModel model = new AModel{ places = GetItems(), SelectedValue = 0 };

    return View(model);
}

这是你的新GetItems方法:

public IEnumerable<SelectListItem> GetItems()
{
    List<SelectListItem> list = new List<SelectListItem>();

    list.Add(new SelectListItem { Text = "Ptuj", Value = "1" });
    list.Add(new SelectListItem { Text = "Celje", Value = "2" });
    list.Add(new SelectListItem { Text = "Laško", Value = "3" });
    list.Add(new SelectListItem { Text = "Maribor", Value = "4" });
    list.Add(new SelectListItem { Text = "Ljubljana", Value = "5" });
    list.Add(new SelectListItem { Text = "N/A", Value = "6" });

    SelectList thelist = new SelectList(list, "Value", "Text");

    return thelist;
}

了解你的情况。

修改(添加视图)

  @model AModel

  @{
      ViewBag.Title = "Index";
  }

  <h2>Example</h2>

  Here are the places: @Html.DropDownListFor(m => m.SelectedValue, (SelectList)Model.Places, "Select a place")

答案 1 :(得分:0)

看起来您在视图中调用了viewmodel / model的GetItems方法。得到物品。不好了 !不要那样做。

将一个集合属性添加到您的viewmodel以获取下拉列表。 Viewmodel只是 POCO 。没有方法。

public class SignUpVM
{
   public string Name{ set;get;}
   public List<SelectListItem> Cities{ set;get;}
   public int PlaceOfBirth {set;get;}
}

现在,在 GET 操作方法中,创建此viewmodel的对象并填充Cities集合属性并将其返回到视图。

public ActionResult Create()
{
 var vm=new SignUpVM();
 vm.Cities=GetCities();
 return View(vm);
}

假设GetCities方法返回城市的SelectListItem列表。

public List<SelectListItem> GetCities()
{
  List<SelectListItem> cityList=new List<SelectListItem>();
  cityList.Add(new SelectListItem { Text = "Ptuj", Value = "1" });
  cityList.Add(new SelectListItem { Text = "Celje", Value = "2" });
  return cityList;
}

现在在我们看来,强烈输入SignUpVM

@model SignUpVM
@using(Html.BeginForm())
{
  @Html.DropDownListFor(x=>x.PlaceOfBirth,
                           new SelectList(Model.Cities,"Value","Text"),"select")
  <input type="submit" />
}

当您提交表单时,您将在PlaceOfBirth属性中获取所选项目的ID。

[HttpPost]
public ActionResult Create(SignUpVM model)
{
  int placeOfBirthId=model.PlaceOfBirth;
  // TO DO : Save and redirect.
}