DropDownlist或DropDownListFor Html帮助器之间的区别

Pau*_*l L 42 asp.net asp.net-mvc entity-framework

我无法找到这两个助手之间差异的解释似乎很奇怪,所以我认为这是显而易见的但我错过了.

基本上我正在尝试使用以下简单模型来决定我应该使用哪一个:

public class Booking
    {
        public int ID { get; set; }
        public Room Room { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public ICollection<Equipment> Equipments { get; set; }
        public string Who { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我希望显示一个简单的Room DropDownlist,用于添加和编辑预订记录.

在做了很多谷歌后,似乎我可能需要一个DropDopwListFor,但不知道为什么以及如何?

Dar*_*rov 86

请看以下两个例子:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text")
)
Run Code Online (Sandbox Code Playgroud)

和:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text")
)
Run Code Online (Sandbox Code Playgroud)

很明显,对于第二个示例,您绑定到下拉列表的属性的名称被硬编码为魔术字符串.这意味着如果您决定重构模型并重命名此属性您可能正在使用的工具支持无法检测此更改并自动修改您在潜在的许多视图中硬编码的魔术字符串.因此,您必须手动搜索并替换使用此弱类型帮助程序的所有位置.

另一方面,在第一个示例中,我们使用与给定模型属性绑定的强类型lambda表达式,因此如果您决定重构代码,工具可以在任何位置自动重命名它.此外,如果您决定预编译视图,则会立即指向需要修复的视图的编译器时间错误.在第二个示例中,您(理想情况下)或您站点的用户(最糟糕的情况)在访问此特定视图时将收到运行时错误.

ASP.NET MVC 2中首次引入了强类型帮助程序,上一次我使用弱类型帮助程序很久以前就在ASP.NET MVC 1应用程序中.


jga*_*fin 6

DropDownListFor 将使用指定的属性自动选择所选值:

// Will select the item in model.Equipments that matches Model.EquipmentId
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 
Run Code Online (Sandbox Code Playgroud)

另一条评论:

没有ICollection<Equipment> Equipments在您的视图模型.你应该有一个返回的属性IEnumerable<SelectListItem>.