@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不能实现这一目标,因为这显然是一个更优雅的解决方案。

有人对此有什么帮助/建议吗?

@Html.EnumDropDownListFor-未设置下拉列表值

我自己刚刚遇到这个问题。发生这种情况的原因是enum类型的字段被串行化为其枚举名称,但@Html.EnumDropDownListFor将其选项值生成为整数。浏览器无法将两者匹配,因此下拉列表保持在默认选择。

有三种方法可以解决这个问题。

  1. 获取视图模型的枚举字段,以便将其正确序列化为int
  2. 编写一个使用枚举名称作为选项值的下拉生成器
  3. 使用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时,查询字符串中没有模型属性,特别是由其字符串值表示的枚举值。