【问题标题】:Difference between DropDownlist or DropDownListFor Html helperDropDownlist 或 DropDownListFor Html 助手之间的区别
【发布时间】:2023-04-05 03:57:01
【问题描述】:

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

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

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; }
    }

我想显示一个简单的 Room DropDownlist 用于添加和编辑预订记录。

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

【问题讨论】:

  • 感谢您提供的好例子,有道理,我的问题很简单:D。但是为什么每个人都给我一个设备下拉列表的例子,但我要求一个房间的工作例子,但我认为他们会以几乎相同的方式工作?

标签: asp.net asp.net-mvc entity-framework


【解决方案1】:

DropDownListFor会通过使用指定的属性自动选择选中的值:

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

另一条评论:

您的视图模型中没有ICollection&lt;Equipment&gt; Equipments。您应该有一个返回 IEnumerable&lt;SelectListItem&gt; 的属性。

【讨论】:

  • 感谢您的帮助。但我实际上是在询问 Room 下拉列表,只是想了解一下。另外,在查看有关设备的 DropdownListFor 的代码中不理解您的示例。似乎您建议我在 ViewModel 中添加一个返回 IEnumberable 的 ViewModel 并将其从控件返回到我的视图而不是 Booking 模型?您能否根据我的模型或更好的模型提供一个完整的工作示例?我现在卡住了,因为我找不到适合我的模型的工作示例。
【解决方案2】:

当你想添加一个视图(aspx 文件),其中 DropDownListDropDownListFor 将在其中,右键单击->添加视图,然后选择“创建强类型视图”,然后在列表中选择 Booking班级。之后添加此页面。

你可以这样写:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments);

因为我们将强类型视图添加为Booking,所以您可以:

m => m.ID, m => m.Room, m => m.StartTime

...等等。

在您的服务中,您可以使用方法从数据库中获取数据,然后在控制器中使用此服务的方法将数据从数据库传递到视图。您可以在控制器中使用ViewData

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable();

AsEnumarable() 放在从数据库中取出的列表的末尾使其成为IEnumarable

那么在你看来,你也可以拥有:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]);

关于 ViewData 使用的链接: http://msdn.microsoft.com/en-us/library/dd410596.aspx

希望对你有帮助。

【讨论】:

  • 您答案中的链接已失效
  • 我相信 ViewData 在 MVC 3 中被 ViewBag 取代:weblogs.asp.net/scottgu/… ViewBag 具有强类型属性,而不是 ViewData 中使用的字符串。这也是为什么我们应该使用 DropDownListFor 而不是 DropDownList 的原因。
【解决方案3】:

举以下两个例子:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text")
)

和:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text")
)

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

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

强类型帮助器是在 ASP.NET MVC 2 中首次引入的,而我上次使用弱类型帮助器是很久以前在 ASP.NET MVC 1 应用程序中。

【讨论】:

  • V6 更新 - 您显然可以使用新的 nameof 关键字 (nameof(x.EquipmentId) 来绕过魔术字符串,它会产生 EquipmentId。
  • 这是否意味着“方法 2”实际上被贬低了?有任何理由使用它吗?
  • 我发现一个有趣的事情是,当我使用第二种方法(即生成的方法)时,我将 int 更改为 int?这允许空值。如果我试图将值更改为 null,则在编辑视图中仍然需要它。它与 create 一起工作得很好,并且会以这种方式保存一个 null 。使用 DropDownListFor 使其验证正确。
【解决方案4】:

DropdownListFor 支持强类型,它的名称由 lambda 表达式分配,因此如果有任何错误,它会显示编译时错误。

DropdownList不支持这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2014-11-29
    • 2019-11-13
    • 2013-09-17
    • 2017-06-02
    相关资源
    最近更新 更多