我有一个可为空的枚举,与同一页面上的其他枚举不同,它不起作用。我有一个枚举,Title
使用扩展方法将有助于填充页面上的下拉列表。ViewBag 声明如下所示:
ViewBag.TitleList = EnumExtensions.ToSelectList<Title>("[select]");
现在,也许有人可以向我解释一下,但这就是在 MVC 中绑定时发生黑魔法的地方。如果调用时页面无效,if(ModelState.IsValid)
则在重新渲染屏幕时,再次调用上述语句。但是,这一次,将选择正确的下拉项(取决于您当时选择了哪一项)。
深入挖掘,这是方法声明:
public static SelectList ToSelectList<TEnum>(string nullEntry = null) where TEnum : struct
{
return ToSelectList<TEnum>(nullEntry, null);
}
public static SelectList ToSelectList<TEnum>(string nullEntry = null, string selectedValue = null) where TEnum : struct
{
var enumType = typeof(TEnum);
var values = Enum.GetValues(enumType).OfType<TEnum>();
List<SelectListItem> items = ToSelectList<TEnum>(values, nullEntry, selectedValue);
SelectList sl = new SelectList(items, "Value", "Text", selectedValue);
return sl;
}
public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, string nullEntry, string selectedValue = null)
{
List<SelectListItem> items;
if ((typeof(T).IsEnum))
{
items = enumerable.Select(f => new SelectListItem()
{
Text = f.GetDescription(),
Value = f.ToString(),
Selected = f.ToString() == selectedValue
}).ToList();
}
else
{
items = enumerable.Select(f => new SelectListItem()
{
Text = f.ToString(),
Value = f.ToString()
}).ToList();
}
if (!string.IsNullOrEmpty(nullEntry))
{
items.Insert(0, new SelectListItem() { Text = nullEntry, Value = "" });
}
return items;
}
只有一些重载可以处理随机情况,尽管可能不需要其中一些。
正如我所说,将为其他枚举选择正确的项目,但对于这个特定的项目,标题,它不会。这是枚举声明:
public enum Title
{
Mr,
Miss,
Mrs,
Ms
}
最后,DropDownListFor
在页面本身上使用的声明;
@Html.DropDownListFor(x => x.Title, (SelectList)ViewBag.TitleList)
问题是当我第一次访问页面时,选中的项目总是“[select]”(当提供的枚举值在模型中为空时)。但是,模型属性Title
肯定有一个值设置,并且该SelectedItem
属性也是为下拉列表设置的,但是在屏幕上,它默认为“[select]”,这是出乎意料的。
有任何想法吗?