我有一个返回列表项的方法。当我尝试用这个项目填充DropDownList时,出现了问题。每次我都会得到一个空异常。诱饵在哪里?
方法:
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())发布于 2013-04-07 09:10:24
我会将该列表更改为SelectList。您已经在使用SelectListItems了,所以您不妨全力以赴,使用SelectList。
然后,只要返回SelectList即可。您可以将签名返回类型保留为IEnumerable,因为SelectList类实现了该接口(好吧,不管怎样,它是父接口)。
让我用一个例子来详细说明。这是一个模型:
public class AModel
{
public IEnumerable<SelectListItem> places { get; set; }
public int SelectedValue { get; set; }
}下面是一个Index操作方法:
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")发布于 2013-04-07 09:25:34
看起来您正在调用视图中视图模型/模型的GetItems方法。才能拿到东西。哦,不!别干那事。
将集合属性添加到下拉列表的视图模型中。Viewmodel就是POCO。在这上面没有任何方法。
public class SignUpVM
{
public string Name{ set;get;}
public List<SelectListItem> Cities{ set;get;}
public int PlaceOfBirth {set;get;}
}现在,在您的GET操作方法中,创建此视图模型的一个对象,填充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.
}https://stackoverflow.com/questions/15857508
复制相似问题