我有一个返回列表项的方法。当我尝试使用此项填充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())
答案 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.
}