c# - 为什么 html.dropdownlist 将第一个属性选项设置为选中?

标签 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>

我的模型包含大量属性,但相关的是枚举属性:

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;
    }

问题:

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

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

最佳答案

它是一个不可为 null 的枚举属性,因此它不能为 null。如果可以找到具有相同名称的模型属性,下拉菜单将选择模型的值。

所以使模型属性可为空,这样它就不会具有 SuperDeveloper 的默认值:

public OverWatchRoles? UserRole { get; set; }

然后将显示“选择一个角色”

关于c# - 为什么 html.dropdownlist 将第一个属性选项设置为选中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080895/

相关文章:

c# - 从不同的类库访问字符串资源

c# - 右键单击获取多个文件路径

javascript - C# MVC Controller 无法从 Ajax POST 请求中获取十进制或 double 值

asp.net - 如何将文件发送到客户端以便打开下载对话框?

c# - 重构ViewModel映射-处理多个服务调用

asp.net-mvc - 使用 Ninject 进行 SignalR 2 依赖注入(inject)

C# 通过属性反射设置属性值

c# - RegEx表达帮助

asp.net - 处理 asp :ScriptManager 时 mscorlib.dll 中的 ExecutionEngineException (80131506)

c# - 如何强制 jqGrid 4.10.1-pre 始终对 ' 字符进行编码