@Html.EnumDropDownListFor-未设置下拉列表值
本文关键字:下拉列表 设置 EnumDropDownListFor- @Html | 更新日期: 2023-09-27 18:21:51
我有一个基本表单,允许用户输入详细信息,然后将其发布并保存到数据库中-这可以正常工作,没有任何问题:
@model R32.Register.Models.RegisterCar
@{
ViewBag.Title = "Edit Your R32";
}
<h2>Edit R32</h2>
<div>
@using (Html.BeginForm("UpdateCar", "Garage", FormMethod.Post))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Enter details</legend>
<ol>
<li>
@Html.LabelFor(m => m.NumberPlate)
@Html.EditorFor(m => m.NumberPlate, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.NumberPlate)
</li>
<li>
@Html.LabelFor(m => m.Edition)
@Html.EnumDropDownListFor(m => m.Edition, "Select an edition:", new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Edition)
</li>
<li>
@Html.LabelFor(m => m.Colour)
@Html.EnumDropDownListFor(m => m.Colour, "Select a colour:", new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Colour)
</li>
</ol>
<input type="submit" value="Save Changes" />
</fieldset>
}
</div>
型号片段:
[Required]
[Display(Name="Edition")]
public MkEnum? Edition { get; set; }
枚举:
public enum MkEnum
{
[Display(Name="Mk4")]
Mk4 = 1,
[Display(Name="Mk5")]
Mk5 = 2
}
控件按预期渲染,版本下拉列表有三个值:"选择版本"、"Mk4"answers"Mk5"。
用户可以选择一个版本,验证控件,然后将其发布到控制器。
Post成功,所有选定的值都被发送到控制器,然后应用程序将数据保存在数据库中,以此类推,没有任何问题。
问题是,当我将此模型传递回同一视图以允许用户编辑保存的数据时,枚举的保存值不会设置为下拉列表中的选定值。
我可以确认,任何保存的字符串值,如本例中的NumberPlate,都会被传递回视图并加载到UI中。
在视图模型渲染时在其上放置断点,我可以确认我的@model包含枚举属性的保存值(例如Edition),但最终结果是"选择版本:"下拉列表渲染时包含预期的下拉值,但它的值是默认的"选择版本:",而不是通过传递的实际值。m.Edition.
我已经能够使用DropDownListFor实现这一点,但我很难理解为什么使用EnumDropDownList不能实现这一目标,因为这显然是一个更优雅的解决方案。
有人对此有什么帮助/建议吗?
我自己刚刚遇到这个问题。发生这种情况的原因是enum类型的字段被串行化为其枚举名称,但@Html.EnumDropDownListFor将其选项值生成为整数。浏览器无法将两者匹配,因此下拉列表保持在默认选择。
有三种方法可以解决这个问题。
- 获取视图模型的枚举字段,以便将其正确序列化为int
- 编写一个使用枚举名称作为选项值的下拉生成器
-
使用javascript手动选择选项(此处包括剃刀语法)
$("#YourDropdownID option").each(function () { if ($(this).html() == '@(Html.DisplayFor(o => o.YourEnumFieldName))') { $(this).attr("selected", "selected"); return; } });
好的,从我所看到的情况来看,问题是由使用ActionLink传递回正在编辑的项目的完整模型引起的。所有内容都在Query字符串中发送回来,所以我的Enum值以以下方式传递给控制器:mkEnum=Mk4。
然后,我加载UpdateCar视图,如上面的示例所示,但查询字符串值在对视图的回调中被持久化。
EnumDropDownListFor无法将枚举的文本值解释/转换为其实际值-如果我手动将Query字符串编辑为mkEnum=1,则正确的值将加载到ViewModel中。
除了这个问题之外,将整个模型传递回控制器并不是一个好的解决方案。我修改了代码,将正在编辑的项目的单个Id传递回-然后控制器验证用户是否有权访问该Id,从数据库中检索模型,然后将其传递回与我上面的示例相同的视图。
有了这个变化,我的下拉列表现在正在更新它们的值,没有任何问题。
TLDR;如果遇到此问题,请检查以确保在加载视图并使用EnumDropDownListFor时,查询字符串中没有模型属性,特别是由其字符串值表示的枚举值。