问题:
需要绑定一个强类型模型,该模型的性别为enum属性。我还喜欢显示一个显示文本从一个资源文件。
My Model is
public enum GenderViewModel
{
[Display(Name = "Male", ResourceType = typeof(Resources.Global), Order = 0)]
Male,
[Display(Name = "Female", ResourceType = typeof(Resources.Global), Order = 1)]
Female
}
最初,我尝试按照http://romikoderbynew.com/2012/02/23/asp-net-mvc-rendering-enum-dropdownlists-radio-buttons-and-listboxes/
但它有点复杂,我无法纠正我的HTML,但我想。
然后我看到了简单易用的实现从stackoverflow,传递enum到html。radiobuttonfor MVC3
并在cshtml中使用HtmlHelper,如下所示
@Html.RadioButtonForEnum(m => m.Gender)
HTML产生
<label for="_Gender_Male">
<input type="radio" value="Male" name="Gender" id="_Gender_Male"
data-val-required="Gender is required" data-val="true" checked="checked">
<span class="radiotext">Male</span>
</label>
<label for="_Gender_Female">
<input type="radio" value="Female" name="Gender" id="_Gender_Female">
<span class="radiotext">Female</span></label>
它真的很简单,对我很有效。但我没有得到价值从资源文件。我的应用程序是多语言的,我使用全球不同语言支持的资源文件。
问题:
男性显示的应该是男性女性显示的应该是Kvinna应该来自资源文件,因为我目前的文化是sv-se
有谁能提供一个简单的解决方案,对HTML有很好的控制?
您所要做的就是调整my original helper
,使其考虑到DisplayAttribute
:
public static class HtmlExtensions
{
public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
if (!metaData.ModelType.IsEnum)
{
throw new ArgumentException("This helper is intended to be used with enum types");
}
var names = Enum.GetNames(metaData.ModelType);
var sb = new StringBuilder();
var fields = metaData.ModelType.GetFields(
BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
);
foreach (var name in names)
{
var id = string.Format(
"{0}_{1}_{2}",
htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
metaData.PropertyName,
name
);
var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
var field = fields.Single(f => f.Name == name);
var label = name;
var display = field
.GetCustomAttributes(typeof(DisplayAttribute), false)
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (display != null)
{
label = display.GetName();
}
sb.AppendFormat(
"<label for="{0}">{1}</label> {2}",
id,
HttpUtility.HtmlEncode(label),
radio
);
}
return MvcHtmlString.Create(sb.ToString());
}
}
现在,如果你用DisplayAttribute修饰了一些枚举值,这些值将来自资源文件
如果使用name
代替<label>
来使用您想要的资源,您应该在扩展方法中替换。
你应该使用类似于我从这里改编的代码:
var type = typeof(metaData.ModelType);
var memInfo = type.GetMember(name);
var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
var description = ((DisplayAttribute)attributes[0]).GetDescription();
然后将description
放入<label>
。
我还没有测试过!