2012-12-31 53 views
2

問題:單選按鈕枚舉幫手模型與資源文件

需要綁定具有性別作爲枚舉屬性強類型的模型。另外我想顯示來自資源文件的顯示文本。

我的模型是

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,但是我想要的。

然後我看了一下從計算器簡單,易於實現,pass enum to 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嗎?

+0

你的問題是什麼?什麼不按預期工作或根本不工作? – Diego

+0

@Diego更新了我的問題 –

回答

4

所有你需要做的就是適應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枚舉值,該值將來自資源文件。

+0

謝謝。我在我的應用程序中測試了該代碼。真的很好,很簡單。 –

0

您應該在擴展方法中替換它使用name代替<label>以使用您想要的資源。

您應該使用一個代碼樣這個我改編自here的:

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>

我還沒有測試過!