为什么html.dropdownlist将第一个属性选项设置为选中状态?

时间:2016-08-22 13:28:15

标签: c# asp.net asp.net-mvc

我发现了一些非常奇怪的东西,我希望有人可以解释一下。

我有一个下拉列表:

    <div class="form-group">
        @Html.Label("Roll", new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.DropDownList("UserRole",
           RegistrationHandlers.FilterRoleAssignmentList(),
           "Choose a role",
           new { @class = "form-control", })
        </div>
    </div>

我的模型包含大量属性,但另一个属性是enum属性:

public OverWatchRoles UserRole { get; set; }

枚举:

public enum OverWatchRoles
{
    SuperDeveloper = 0,
    Developer = 1,
    SuperAdministrator = 2,
    Administrator = 3,
    Employee = 4
}

填充下拉列表的方法:

    public static List<SelectListItem> FilterRoleAssignmentList()
    {
        var user = HttpContext.Current.User.Identity;
        ApplicationDbContext context = new ApplicationDbContext();
        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
        var userRole = UserManager.GetRoles(user.GetUserId());

        List<SelectListItem> roles = new List<SelectListItem>();

        switch (userRole[0])
        {
            case "Developer":
                roles = Enum.GetNames(typeof(OverWatchRoles))
               .Where(f => f != OverWatchRoles.SuperDeveloper.ToString())
               .Select(f => new SelectListItem { Value = f, Text = f, Selected = false }).ToList();
                break;

            case "Administrator":
                roles = Enum.GetNames(typeof(OverWatchRoles))
                .Where(f => f != OverWatchRoles.SuperDeveloper.ToString() && f != OverWatchRoles.Developer.ToString() && f != OverWatchRoles.SuperAdministrator.ToString())
                .Select(f => new SelectListItem { Value = f, Text = f, Selected = false }).ToList();
                break;

            default:
                roles = Enum.GetNames(typeof(OverWatchRoles))
                .Select(f => new SelectListItem { Value = f, Text = f, Selected = false }).ToList();
                break;
        }

        return roles;
    }

问题:

我发现当我的dropdownlist =“UserRole”的名称与模型中的propetty名称相同时,默认情况下会选择第一个枚举选项。当我更改下拉列表的名称时,默认选择的值将变为“选择一个角色”。

为什么会这样?我该如何解决呢?我希望“选择一个角色”作为默认选择选项。

2 个答案:

答案 0 :(得分:5)

它是一个不可为空的枚举属性,所以它不能为空。如果下拉列表可以找到具有相同名称的模型属性,则会选择模型的值。

因此,将模型属性设为可为空,使其不会具有默认值SuperDeveloper

public OverWatchRoles? UserRole { get; set; }

然后&#34;选择一个角色&#34; 将会显示。

答案 1 :(得分:1)

只需添加CodeCaster的答案。在反编译Html.DropDownList后,我可以看到它最后调用SelectExtensions.SelectInternal,它使用默认值匹配属性名称,以防它无法获得一个:

  object defaultValue = allowMultiple ? htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof (string[])) : htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof (string));
  if (!flag && defaultValue == null && !string.IsNullOrEmpty(name))
    defaultValue = htmlHelper.ViewData.Eval(name);
  if (defaultValue != null)
    selectList = SelectExtensions.GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple);