为SelectListItems传递null的Razor DropDown助手按惯例使用ViewBag?

时间:2016-06-16 07:14:01

标签: c# asp.net-mvc razor entity-framework-6

以下剃刀

@Html.DropDownList("FloorId", null)

@Html.DropDownListFor(model => model.FloorId, null)

使用外键从我的Entity Framework模型中选择选择列表项。在外国实体中,我碰巧有一个名为Name的属性,用于TextId用于Value

这似乎是伏都教。

这是如何连线的?有没有遵循的惯例?我有IdName财产吗?

我可以在控制器中看到ViewBag添加了选择列表但是没有选择列表被添加到DropDown列表中;除了Id匹配ViewBag属性。

编辑以添加模型

public class Floor
{
    public int Id {get;set;}
    public string Name { get; set; }
}

public class Room
{
    public int Id { get; set; }
    public string RoomName { get; set; }
    [ForeignKey("Floor")]
    public int FloorId { get; set; }

    public virtual Floor Floor { get; set; }
}

如果你支持这个,控制器有:

ViewBag.FloorId = new SelectList(db.Floor, "Id", "Name", room.FloorId);

以上的剃刀。我只能假设,如果SelectListDropDownList没有DropDownListFor它会退回并使用相同ViewBag的{​​{1}}属性它的选择列表?

2 个答案:

答案 0 :(得分:3)

  

我只能假设如果没有为DropDownList或DropDownListFor提供SelectList,它会退回并使用相同Id的ViewBag属性作为它的选择列表吗?

是。这是MVC中许多方便的约定之一,您只能通过挖掘源文章或旧帖子找到,而文档中没有明确提及。

请参阅Using the DropDownList Helper with ASP.NET MVC

  

您可以将IEnumerable<SelectListItem>显式传递给DropDownList助手,也可以使用SelectListItem的相同名称将IEnumerable<SelectListItem>添加到ViewBag 作为模型属性

source

private static IEnumerable<SelectListItem> GetSelectData(this HtmlHelper htmlHelper, string name)
{
    object o = null;
    if (htmlHelper.ViewData != null)
    {
        o = htmlHelper.ViewData.Eval(name);
    }
    if (o == null)
    {
        throw new InvalidOperationException(
            String.Format(
                CultureInfo.CurrentCulture,
                MvcResources.HtmlHelper_MissingSelectData,
                name,
                "IEnumerable<SelectListItem>"));
    }

    // ...

    return selectList;
}

我认为你不应该依赖这样的惯例,但是让代码像这样的脚手架很容易。而是使用包含下拉项目的正确ViewModel。

答案 1 :(得分:1)

使用html帮助程序时,可以使用与“属性”相同的名称 对于你的情况下的例如

ViewBag.FloorId = new SelectList(db.Floor, "Id", "Name", room.FloorId);

如果你在HtmlHelpers中使用FloorId就像你做的那样

@Html.DropDownListFor(model => model.FloorId, null)

它将自动假设ViewBag属性适用于此DropDown,因为它具有通用名称