将DropDownList绑定到MVC视图中

Abh*_*eet 8 asp.net-mvc

从这里开始阅读:ASP.NET MVC

SelectCategory控制器内部已创建操作-

 public ActionResult SelectCategory() {

     List<SelectListItem> items = new List<SelectListItem>();    
     items.Add(new SelectListItem { Text = "Action", Value = "0"});    
     items.Add(new SelectListItem { Text = "Drama", Value = "1" });    
     items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });    

     ViewBag.MovieType = items;

     return View();    
 }
Run Code Online (Sandbox Code Playgroud)

我无法理解以下行中数据的绑定.

@Html.DropDownList("MovieType")
Run Code Online (Sandbox Code Playgroud)

虽然以类似的方式绑定数据,

@Html.DropDownList("IdList");
Run Code Online (Sandbox Code Playgroud)

我获得以下错误 -

没有类型为'IEnumerable'的ViewData项具有键'IdList'.

控制器动作:

public ActionResult SelectId()
    {
        List<SelectListItem> items = new List<SelectListItem>();
        items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
        items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });

        ViewBag.IdList = items;
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我错过了什么?谢谢您的帮助 !

Dar*_*rov 22

你有ViewBag.MovieType使用@Html.DropDownList("MovieType")下拉列表设置=> 将使用此值.在编写时@Html.DropDownList("IdList"),帮助程序IdList在ViewBag中找不到相应的属性并抛出错误,因为它不知道从何处绑定数据.

或者,如果要更改下拉列表的名称,可以使用以下内容:

@Html.DropDownList("SelectedMovieType", (IEnumerable<SelectListItem>)ViewBag.MovieType)
Run Code Online (Sandbox Code Playgroud)

并且您的POST操作将有一个SelectedMovieType参数来检索所选值.

但我会避免使用ViewBag.定义视图模型更好:

public class MyViewModel
{
    public string SelectedMovieType { get; set; }
    public IEnumerable<SelectListItem> MovieTypes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后让控制器操作填充此视图模型并将其传递给视图:

public ActionResult SelectId()
{
    List<SelectListItem> items = new List<SelectListItem>();
    items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
    items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });

    var model = new MyViewModel
    {
        MovieTypes = items    
    };

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

并在您的强类型视图中:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedMovieType, Model.MovieTypes)
Run Code Online (Sandbox Code Playgroud)