【问题标题】:Razor DropDown helpers with null passed for the SelectListItems uses ViewBag by convention?为 SelectListItems 传递 null 的 Razor DropDown 助手按惯例使用 ViewBag?
【发布时间】:2016-06-16 07:14:01
【问题描述】:

以下剃须刀

@Html.DropDownList("FloorId", null)

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

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

这似乎是巫术。

这是如何连接的?有什么要遵守的约定吗?我拥有IdName 属性是纯粹的运气吗?

我可以在控制器中看到ViewBag 添加了选择列表,但没有将选择列表添加到下拉列表中;除了让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);

还有上面的剃刀。我只能假设,如果没有将SelectList 分配给DropDownListDropDownListFor,它将回退并使用同一IdViewBag 属性作为它的选择列表?

【问题讨论】:

  • 您能否展示相关的实体类,您实际如何调用DropDownList(For) 以及生成的HTML 是什么样的?
  • @CodeCaster 它实际上是在 Visual Studio 中搭建的,没有添加任何其他内容。我将添加要展示的模型
  • 是的,但我从未见过@Html.DropDownList 从无处抓取随机实体。我的意思是,如果您可以花更多的精力先完成问题,为什么还要花费 200 声望。 :)

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


【解决方案1】:

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

是的。这是 MVC 中众多方便的约定之一,您只能通过挖掘源代码或旧博客文章才能找到,并且文档中没有明确提及。

Using the DropDownList Helper with ASP.NET MVC:

您可以将IEnumerable<SelectListItem> 显式传递给DropDownList 帮助程序,或者您可以将IEnumerable<SelectListItem> 添加到ViewBag 使用与模型属性相同的名称来选择SelectListItem

而在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。

【讨论】:

  • 我找到了那篇文章,但无法在任何地方验证任何文档中的任何内容,因此提出了这个问题。似乎 MVC 散布着一些约定,没有任何明确的指导或一致性
【解决方案2】:

在使用 html 帮助器时,您可以使用与您的属性相同的名称 例如,在你的情况下

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

如果你像你一样在 HtmlHelpers 中使用 FloorId

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

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

【讨论】:

  • OP 询问这是如何工作的以及记录在哪里。
  • 我在教程中找到了这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多