Asp.net mvc 3 下拉列表以供发布

Asp.net mvc 3 下拉列表以供发布,asp.net-mvc-3,Asp.net Mvc 3,我有一个返回列表项的方法。当我尝试用这些项目填充DropDownList时,出现了问题。我每次都会得到一个空异常。陷阱在哪里 方法: public IEnumerable<SelectListItem> GetItems() { List<SelectListItem> list = new List<SelectListItem>(); list.Add(new SelectListItem { Text = "Pt

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

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

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

让我举例说明。以下是一个模型:

public class AModel
{
    public IEnumerable<SelectListItem> places { get; set; }
    public int SelectedValue { get; set; }
}
下面是新的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;
}
public IEnumerable GetItems()
{
列表=新列表();
添加(新建SelectListItem{Text=“Ptuj”,Value=“1”});
添加(新的SelectListItem{Text=“Celje”,Value=“2”});
添加(新的SelectListItem{Text=“Laško”,Value=“3”});
添加(新的SelectListItem{Text=“Maribor”,Value=“4”});
添加(新建SelectListItem{Text=“Ljubljana”,Value=“5”});
添加(新建SelectListItem{Text=“N/A”,Value=“6”});
SelectList thelist=新的SelectList(列表,“值”、“文本”);
返回列表;
}
看看你怎么做

编辑(添加视图)

  @model AModel

  @{
      ViewBag.Title = "Index";
  }

  <h2>Example</h2>

  Here are the places: @Html.DropDownListFor(m => m.SelectedValue, (SelectList)Model.Places, "Select a place")
@model AModel
@{
ViewBag.Title=“Index”;
}
例子
以下是位置:@Html.DropDownListFor(m=>m.SelectedValue,(SelectList)Model.places,“选择一个位置”)

看起来您正在调用视图中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;}
}
假设
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;
}
提交表单时,您将在
PlaceOfBirth
属性中获得所选项目的id

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

我仍然在同一行中得到null异常。这可能是因为运行应用程序时首先显示“索引”页面吗?因为我认为,在我点击提交之前,列表是空的。如果我在项目属性中将第一页更改为“信息”,则会出现404错误。您是否在get action方法或帖子中看到错误?下拉菜单是否正在呈现某些项目?@cvenko我的表单标记中有拼写错误。我已更正。尝试更新后的答案。我在“Index”视图的第行中发现错误:
@Html.DropDownListFor(model=>model.PlaceOfBirth,new SelectList(model.Cities,“Value”,“Text”),“select”)
@cvenko,我们将在
Create
操作中返回城市的视图模型。不
索引
视图中的代码是什么样子的?要显示DropDownlist。@cvenko,我编辑了答案以包含razor视图,该视图应称为Index.cshtml,并放置在解决方案中视图文件夹内名为Home的文件夹中。我还将SelectedValue更改为0,以显示默认文本。
public ActionResult Create()
{
 var vm=new SignUpVM();
 vm.Cities=GetCities();
 return View(vm);
}
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;
}
@model SignUpVM
@using(Html.BeginForm())
{
  @Html.DropDownListFor(x=>x.PlaceOfBirth,
                           new SelectList(Model.Cities,"Value","Text"),"select")
  <input type="submit" />
}
[HttpPost]
public ActionResult Create(SignUpVM model)
{
  int placeOfBirthId=model.PlaceOfBirth;
  // TO DO : Save and redirect.
}