DropDownListFor HTML帮助程序未选择枚举模型属性的选项



我有一个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;
    }
}

"Select"选项始终在下拉列表中选中,即使我可以遍历代码并看到其中一个SelectListItem对象的Selected属性设置为true

我已经尝试了在我的模板化助手中推荐的解决方案,使用DropDownListFor并不反映枚举的模型。为什么?但是这个解决方案是面向MVC 3的。我尝试了这个解决方案(将SelectList对象作为第二个参数传递给Html.DropDownListFor),得到的只是一个下拉列表,其中有4个选项,显示文本为"System.Web.Mvc.SelectListItem",而<option>标记没有值。

此外,我还尝试了创建@Html.EnumDropDownListFor(...)辅助函数的其他解决方案,其行为与此相同。看起来,尽管选择了正确的SelectListItem,但可能当前的Model.Status值正在覆盖它?

更新#1

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

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