将模型加载到HTML DropDownListFor Helper时遇到问题

时间:2016-11-04 18:42:28

标签: asp.net-mvc html-helper

我有一个名为Region的简单模型,就像

namespace App
{
    using System;
    using System.Collections.Generic;

    public partial class Region
    {
        public int RegionID { get; set; }
        public string RegionDescription { get; set; }
    }
}

我试图将模型加载到视图中的HTML DropDownListFor()帮助器中,如

@model IEnumerable<App.Region>

<div class="row">
    @Html.DropDownListFor("RegionList",
                    new SelectList(model => model.RegionDescription),
                    "Select Region",
                    new { @class = "form-control" })

</div>

@model IEnumerable<App.Region>
<div class="row">
    @Html.DropDownListFor("RegionList",
                        new SelectList(s => s.RegionDescription),
                        "Select Region",
                        new { @class = "form-control" })

</div>

或:

@model IEnumerable<App.Region>
<div class="row">
@foreach (var item in Model)
{
    @Html.DropDownListFor("RegionList",
                        new SelectList(model => item.RegionDescription),
                        "Select Region",
                        new { @class = "form-control" })
}
</div>

但在这两种方式中我都收到了这个错误。

  

无法将lambda表达式转换为'object'类型,因为它不是a   委托类型

你能否告诉我为什么会这样,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

SelectList构造函数将集合作为第一个参数。不是lamda表达!您正在以不正确的方式使用帮助程序方法!

理想情况下,Html.DropDownListFor方法的第一个参数是一个表达式,帮助程序可以从中获取视图模型属性的值。这意味着,要使用它,您的视图模型应具有存储所选选项值的属性。所以创建一个像这样的视图模型

public class CreateVm
{
  public int SelectedRegion { set;get;}
  public List<SelectListItem> Regions { set;get;}
}

现在在您的GET操作中,您需要创建此视图模型的对象,加载Regions集合属性并将其发送到视图

public ActionResult Create()
{
  var vm = new CreateVm();
  vm.Regions = new List<SelectListItem>{
         new SelectListItem { Value="1", Text="Region1"},
         new SelectListItem { Value="2", Text="Region2"},
         new SelectListItem { Value="3", Text="Region3"}
  };
  return View(vm);
}

并且在您的视图中强烈键入此新视图模型,您可以使用此类DropDownListFor辅助方法

@model CreateVm
@Html.DropDownListFor(x=>x.SelectedRegion,Model.Regions,"Select Region",
                                                            new { @class = "form-control" })

如果您确实想要使用传递给视图的现有视图模型/类型,可以考虑使用Html.DropDownList辅助方法来渲染SELECT元素

@Html.DropDownList("SelectedRegion", 
                    new SelectList(Model, "RegionID", "RegionDescription"), "Select Region",
                    new { @class = "form-control" })

这将呈现名为"SelectedRegion"

的SELECT元素