【问题标题】:DropDownListFor HTML helper not selecting option for Enum model propertyDropDownListFor HTML 助手没有选择枚举模型属性的选项
【发布时间】:2014-10-21 18:30:40
【问题描述】:

我有一个 ASP.NET MVC 4 站点和一个使用枚举的域模型。我能够生成SelectListItem 对象的列表,但未选择正确的项目。

领域模型

public enum ApplicationStatus
{
    Unknown = 0,
    Incomplete = 1,
    Submitted = 2,
    Error = 4
}

public class Application
{
    public ApplicationStatus Status { get; set; }

    // ...
}

“编辑”视图

@model Application

@using (Html.BeginForm("Edit", "Applications", new { ... }, FormMethod.Post, new { role = "form", @class = "form-horizontal" }))
{
    @Html.Partial("_Form", Model)

    <p>
        @Html.ActionLink("Cancel", "Details", new { ... }, new { @class = "btn btn-default" })
        <button type="submit" class="btn btn-primary">Save</button>
    </p>
}

“_Form”部分

@model BWE.Models.Entity.BitWeb.Application

@Html.ValidationSummary(true)

<div class="form-group">
    @Html.LabelFor(model => model.Status, new { @class = "col-sm-2" })
    <div class="col-sm-10">
        @Html.DropDownListFor(model => model.Status, SelectHelper.GetApplicationStatusOptions(Model.Status))
        @Html.ValidationMessageFor(model => model.Status)
    </div>
</div>

选择助手

public static class SelectHelper
{
    public static IEnumerable<SelectListItem> GetApplicationStatusOptions(ApplicationStatus currentStatus)
    {
        var items = new List<SelectListItem>()
        {
            new SelectListItem()
            {
                Text = "Select",
                Value = string.Empty
            }
        };

        IEnumerable<ApplicationStatus> statuses = Enum.GetValues(typeof(ApplicationStatus)).Cast<ApplicationStatus>();

        foreach (var status in statuses)
        {
            if (status == ApplicationStatus.Unknown)
                continue;

            items.Add(new SelectListItem()
            {
                Text = status.ToString(),
                Value = ((int)status).ToString(),
                Selected = status == currentStatus
            });
        }

        return items;
    }
}

“选择”选项始终在下拉列表中被选中,即使我可以单步执行代码并看到其中一个 SelectListItem 对象将其 Selected 属性设置为 true

我已经尝试了My templated helper using a DropDownListFor does NOT reflect the model of enum. Why? 中推荐的解决方案,但该解决方案面向 MVC 3。我尝试了解决方案(将 SelectList 对象作为第二个参数传递给 Html.DropDownListFor),我得到的只是一个包含 4 个选项的下拉列表,其显示文本为“System.Web.Mvc.SelectListItem”,&lt;option&gt; 标记没有值。

此外,我尝试了其他创建 @Html.EnumDropDownListFor(...) 辅助函数的解决方案,其行为方式相同。似乎尽管选择了正确的 SelectListItem,但当前的 Model.Status 值是否覆盖了它?

更新 #1

我添加了一个名为StatusId 的整数属性,它获取并将Status 属性设置为整数,这在调用Html.DropDownListFor(model =&gt; model.StatusId, ...) 时有效,但是我希望有一个解决方案允许我直接使用枚举值,不是通过另一个属性作为代理。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 enums


    【解决方案1】:

    出于某种疯狂的原因,Razor 将枚举值呈现为基于字符串的名称,而不是对应的整数值。无论如何,我的猜测是您的 SelectHelper 正在返回值作为整数的选项,这就是为什么将您的枚举值转换为 int 允许选择起作用的原因。由于这是您无论如何都拥有的自定义组件,因此我建议您简单地修改您的助手以将枚举字符串名称作为选项值而不是整数返回。然后属性值和选项值将正确对齐。

    【讨论】:

    • 哦,大声哭泣(手 -> 额头)。就是这样。从Value = ((int)status).ToString() 更改为Value = status.ToString() 成功了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多