0

我有一个返回列表项的方法。当我尝试用这些项目填充 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())
4

2 回答 2

0

我会将该列表更改为 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")
于 2013-04-07T01:10:23.623 回答
0

看起来您正在视图中调用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.
}
于 2013-04-07T01:25:33.920 回答