我已经为 EditorFor 和 DisplayFor 辅助方法创建了几个 MVC 模板,以使用 Twitter Bootstrap 框架按照我想要的方式设置样式。我现在有一个适用于我需要的所有位的工作解决方案,但想概括我设置的一个部分以显示状态列表。我有一个州枚举(包含所有美国州的列表),我在用户地址的下拉列表中显示。我使用 [DataType] 属性让 MVC 使用我的 State.cshtml 模板。
[Required]
[Display(Name = "State")]
[DataType("State")]
public State State { get; set; }
所以它工作得很好,但我想改变它,以便我可以做一些类似 DataType("Enum") 或其他方式来为所有枚举通用地点击这个模板。
模板如下所示:
@using System
@using System.Linq
@using Beno.Web.Helpers
@using TC.Util
@model Beno.Model.Enums.State
<div class="control-group">
@Html.LabelFor(m => m, new {@class = "control-label{0}".ApplyFormat(ViewData.ModelMetadata.IsRequired ? " required" : "")})
<div class="controls">
<div class="input-append">
@Html.EnumDropDownListFor(m => m)
<span class="add-on">@(new MvcHtmlString("{0}".ApplyFormat(ViewData.ModelMetadata.IsRequired ? " <i class=\"icon-star\"></i>" : "")))</span>
</div>
@Html.ValidationMessageFor(m => m, null, new {@class = "help-inline"})
</div>
</div>
EnumDropDownListFor 是我之前发布的一个辅助方法,它通常适用于任何枚举。我不知道如何更改此模板以将通用枚举作为模型对象?
更新:为了完整起见,我列出了 EnumDropDownListFor 方法:
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) where TProperty : struct, IConvertible
{
if (!typeof(TProperty).IsEnum)
throw new ArgumentException("TProperty must be an enumerated type");
var selectedValue = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model.ToString();
var selectList = new SelectList(from value in EnumHelper.GetValues<TProperty>()
select new SelectListItem
{
Text = value.ToDescriptionString(),
Value = value.ToString()
}, "Value", "Text", selectedValue);
return htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
}
将模型类型更改为 Enum 会在调用辅助方法的那一行产生以下错误:
CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'TProperty' in the generic type or method 'Beno.Web.Helpers.ControlHelper.EnumDropDownListFor<TModel,TProperty>(System.Web.Mvc.HtmlHelper<TModel>, System.Linq.Expressions.Expression<System.Func<TModel,TProperty>>, object)'
然后,如果我删除检查 TProperty 是否为枚举和约束的结构,我会在我试图获取枚举值的行上得到一个编译错误:
System.ArgumentException: Type 'Enum' is not an enum
我想知道是否不可能做我在这里尝试的事情。