DropDownListFor HTML帮助程序不为Enum模型属性选择选项

时间:2014-10-21 18:30:41

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

我有一个ASP.NET MVC 4站点和一个使用Enum的域模型。我能够生成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>

SelectHelper

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”,而<option>标签没有值。

此外,我尝试了其他创建@Html.EnumDropDownListFor(...)辅助函数的解决方案,其行为方式相同。似乎所有正确的SelectListItem都被选中,当前Model.Status值可能会覆盖它吗?

更新#1

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

1 个答案:

答案 0 :(得分:2)

出于某些疯狂的原因,枚举值由Razor呈现为基于字符串的名称,而不是它们的整数值对应物。无论如何,我的猜测是你的SelectHelper返回值为整数的选项,这就是为什么将你的枚举值转换为int允许选择工作的原因。由于这是一个你自己的自定义组件,我建议只需修改你的帮助器,将枚举字符串名称作为选项值而不是整数返回。然后,属性值和选项值将正确排列。