我发现了一些非常奇怪的东西,我希望有人可以解释一下。
我有一个下拉列表:
<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名称相同时,默认情况下会选择第一个枚举选项。当我更改下拉列表的名称时,默认选择的值将变为“选择一个角色”。
为什么会这样?我该如何解决呢?我希望“选择一个角色”作为默认选择选项。
答案 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);