首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DropDownListFor问题

DropDownListFor问题
EN

Stack Overflow用户
提问于 2013-04-07 08:25:20
回答 2查看 92关注 0票数 0

我有一个返回列表项的方法。当我尝试用这个项目填充DropDownList时,出现了问题。每次我都会得到一个空异常。诱饵在哪里?

方法:

代码语言:javascript
复制
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;
        }
    }

查看:

代码语言:javascript
复制
@Html.LabelFor(model => model.PlaceOfBirth)
        @Html.DropDownListFor(model => model.PlaceOfBirth, //Exception thrown in this line
        Model.GetItems())
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 09:10:24

我会将该列表更改为SelectList。您已经在使用SelectListItems了,所以您不妨全力以赴,使用SelectList。

然后,只要返回SelectList即可。您可以将签名返回类型保留为IEnumerable,因为SelectList类实现了该接口(好吧,不管怎样,它是父接口)。

让我用一个例子来详细说明。这是一个模型:

代码语言:javascript
复制
public class AModel
{
    public IEnumerable<SelectListItem> places { get; set; }
    public int SelectedValue { get; set; }
}

下面是一个Index操作方法:

代码语言:javascript
复制
public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

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

    return View(model);
}

下面是您的新GetItems方法:

代码语言:javascript
复制
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;
}

看看你是怎么做的。

编辑(添加视图)

代码语言:javascript
复制
  @model AModel

  @{
      ViewBag.Title = "Index";
  }

  <h2>Example</h2>

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

Stack Overflow用户

发布于 2013-04-07 09:25:34

看起来您正在调用视图中视图模型/模型的GetItems方法。才能拿到东西。哦,不!别干那事。

将集合属性添加到下拉列表的视图模型中。Viewmodel就是POCO。在这上面没有任何方法。

代码语言:javascript
复制
public class SignUpVM
{
   public string Name{ set;get;}
   public List<SelectListItem> Cities{ set;get;}
   public int PlaceOfBirth {set;get;}
}

现在,在您的GET操作方法中,创建此视图模型的一个对象,填充Cities集合属性并将其返回给视图。

代码语言:javascript
复制
public ActionResult Create()
{
 var vm=new SignUpVM();
 vm.Cities=GetCities();
 return View(vm);
}

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

代码语言:javascript
复制
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

代码语言:javascript
复制
@model SignUpVM
@using(Html.BeginForm())
{
  @Html.DropDownListFor(x=>x.PlaceOfBirth,
                           new SelectList(Model.Cities,"Value","Text"),"select")
  <input type="submit" />
}

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

代码语言:javascript
复制
[HttpPost]
public ActionResult Create(SignUpVM model)
{
  int placeOfBirthId=model.PlaceOfBirth;
  // TO DO : Save and redirect.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档