Asp.net DropDownlist与DropDownlist for Html helper之间的区别
奇怪的是,我找不到解释这两个助手之间区别的方法,所以我认为这是很明显的,但我忽略了 基本上,我正在尝试使用以下简单模型来决定我的案例应该使用哪一个:Asp.net DropDownlist与DropDownlist for Html helper之间的区别,asp.net,asp.net-mvc,entity-framework,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 E
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; }
}
公共课预订
{
公共int ID{get;set;}
公共房间{get;set;}
公共日期时间开始时间{get;set;}
公共日期时间结束时间{get;set;}
公共i采集设备{get;set;}
公共字符串Who{get;set;}
}
我想显示一个简单的房间下拉列表,用于添加和编辑预订记录
在做了大量的谷歌搜索之后,似乎我可能需要DropDopwListFor,但不确定原因和方式?
DropDownListFor
将使用指定的属性自动选择所选值:
// Will select the item in model.Equipments that matches Model.EquipmentId
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments);
另一评论:
视图模型中没有
i采集设备
。当您想要添加视图(aspx
文件)时,您应该有一个返回IEnumerable
的属性,该视图(DropDownList
或DropDownListFor
将位于其中,右键单击->添加视图,然后选择“创建强类型视图”,然后在列表中选择Booking
类。之后添加此页面
您可以在其中写入以下内容:
@Html.DropdownListFor(m => m.Equipments , Model.Equipments);
由于我们将强类型视图添加为预订
,因此您可以:
m => m.ID, m => m.Room, m => m.StartTime
。。。等等
在您的服务中,您可以使用方法从数据库获取数据,然后在控制器中使用此服务的方法将数据从数据库传递到视图。您可以在控制器中使用ViewData
:
ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable();
将AsEnumarable()
放在从数据库获取的列表末尾,使其成为IEnumarable
在您看来,您还可以:
@Html.DropdownList("MyEquipments" , ViewData["Equipments"]);
有关ViewData用法的链接:
我希望这对您有所帮助。举以下两个例子:
@Html.DropDownListFor(
x => x.EquipmentId,
new SelectList(Model.Equipments, "Id", "Text")
)
以及:
显然,在第二个示例中,要将下拉列表绑定到的属性的名称被硬编码为神奇字符串。这意味着,如果您决定重构模型并重命名此属性,那么您可能正在使用的工具支持无法检测此更改并自动修改您在可能的多个视图中硬编码的神奇字符串。因此,您必须手动搜索并替换使用此弱类型助手的所有位置
另一方面,在第一个示例中,我们使用了一个与给定模型属性关联的强类型lambda表达式,因此如果您决定重构代码,工具可以在使用它的任何地方自动重命名它。此外,如果您决定预编译视图,您将立即得到一个编译器时间错误,该错误指向需要修复的视图。对于第二个示例,您(理想情况下)或您站点的用户(最坏情况下)在访问此特定视图时将出现运行时错误
强类型帮助程序最早是在ASP.NET MVC 2中引入的,上次我在ASP.NET MVC 1应用程序中使用弱类型帮助程序是很久以前的事了。
DropdownListFor
支持强类型,它的名称由lambda表达式指定,因此如果有任何错误,它会显示编译时错误
DropdownList
不支持此操作。谢谢您的帮助。但我实际上是在询问房间下拉列表,只是想了解一下。另外,在查看关于DropdownListFor设备的代码时,不理解您的示例。您似乎建议我添加一个ViewModel,该ViewModel在我的ViewModel中返回IEnumberable,并将其从controll返回到我的视图,而不是预订模型?您能提供一个基于我的模型或更好的模型的完整工作示例吗?我现在被卡住了,因为我找不到一个适合我的模型的工作示例。感谢这些好的示例,有意义,我的问题很简单:D.但是为什么每个人都给我一个设备的Dropdownlist示例,但我要的是房间的工作示例,但我认为它们的工作方式基本相同?答案中的链接是dead我相信在MVC 3中ViewData已被ViewBag取代:ViewBag具有强类型属性,而不是ViewData中使用的字符串。为什么我们应该使用DropDownList for而不是DropDownList.Update for V6,其原理是相同的-显然,您可以使用新的nameof关键字(nameof(x.EquipmentId))绕过神奇的字符串,这将导致EquipmentId。那么这是否意味着“方法2”实际上是去润滑的吗?有没有任何理由使用它?我发现一件有趣的事情是,当我使用第二种方法(即生成方法)时当我将int更改为int?时,它允许空值。如果我试图将值更改为空值,则在编辑视图中仍然需要它。它与create一起工作良好,并将以这种方式保存空值。使用DropDownListFor可以正确验证它。
@Html.DropDownList(
"EquipmentId",
new SelectList(Model.Equipments, "Id", "Text")
)