以下剃刀
@Html.DropDownList("FloorId", null)
或
@Html.DropDownListFor(model => model.FloorId, null)
使用外键从我的Entity Framework模型中选择选择列表项。在外国实体中,我碰巧有一个名为Name
的属性,用于Text
,Id
用于Value
。
这似乎是伏都教。
这是如何连线的?有没有遵循的惯例?我有Id
和Name
财产吗?
我可以在控制器中看到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);
以上的剃刀。我只能假设,如果SelectList
或DropDownList
没有DropDownListFor
它会退回并使用相同ViewBag
的{{1}}属性它的选择列表?
答案 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,因为它具有通用名称