2013-08-24 27 views
3

的文字,我開始這樣做是爲了顯示我的觀點有些複選框:試圖用@ Html.CheckBox攜手合作,以顯示枚舉

@Html.LabelFor(m => m.MyEnum, T("Pick Your Poison")) 
<div>     
    @for(int i = 0; i < Model.Alcohol.Count; i++) 
    { 
     <label> 
      @T(Model.Alcohol[i].Text) 
      @Html.CheckBoxFor(m => Model.Alcohol[i].Selected) 
      @Html.HiddenFor(m => Model.Alcohol[i].Value) 
     </label> 
    } 
</div> 

請注意:這裏最重要的是@T方法,這是用於處理文本翻譯成其他語言。

This Works。我有一個簡單的enum,後端的一些方法將它變成視圖中的文本。所以,一個enum如:

public enum MyEnum 
{ 
    Beer = 1, 
    Vodka = 2, 
    Rum = 3 
} 

將顯示與3個選擇複選框的列表。在我的ViewModel中,我這樣做:

Alcohol= Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(x => 
{ 
    return new SelectListItem { 
     Text = x.ToString().ToUpper(), Value = ((int)x).ToString() 
     }; 
    }).ToList(); 
} 

但是,我希望有更多的描述性文本伴隨複選框。我寧願enum有這樣或一些類似類型的系統(我將解釋下劃線):

public enum MyEnum 
{ 
    I_like_Beer = 1, 
    I_hate_Vodka = 2, 
    Meh__Rum = 3 
} 

我試圖創建一個方法剝離出強調,並用空格代替它,在雙下劃線的情況下用逗號代替它,因此當複選框顯示他們會是什麼樣子:

我喜歡啤酒

我恨伏特加

咩,朗姆酒

但我不知道怎麼樣。另外,我不確定這是否是最好的選擇。我很想保留@T函數,因爲那樣我就可以在我的應用程序中輕鬆翻譯。否則,做任何事情都會爲我殺死那些東西。

任何我可能應該做的事情的例子?謝謝。

回答

5

我喜歡對這種事情使用數據註釋。這可以防止瘋狂嘗試找出可變的可讀文本約定。

public enum MyEnum 
{ 
    [Description("I like beer")] 
    Beer = 1, 
    [Description("I hate vodka")] 
    Vodka = 2, 
    [Description("Meh, rum")] 
    Rum = 3 
}; 

可以使用reflection訪問在運行時的值:

MyEnum sampleEnum = MyEnum.Beer; 
var attr = typeof(MyEnum) 
    .GetMember(sampleEnum.ToString()) 
    .First() 
    .GetCustomAttributes(typeof(DescriptionAttribute), false) 
    .First() as DescriptionAttribute; 
string description = attr.Description; 

當然,這是一個有點冗長(和仍需要錯誤處理),但您可以創建一個擴展方法來簡化使用語法:

public static string GetDescriptionOrDefault<T>(this T enumValue, string defaultValue = null) 
{ 
    var attr = typeof(T) 
     .GetMember(enumValue.ToString()) 
     .First() 
     .GetCustomAttributes(typeof(DescriptionAttribute), false) 
     .FirstOrDefault() as DescriptionAttribute; 
    return attr == null ? (defaultValue ?? enumValue.ToString()) : attr.Description; 
} 

這將允許以簡單的寫:

MyEnum sampleEnum = MyEnum.Beer; 
string description = sampleEnum.GetDescriptionOrDefault(); 
+0

我在哪裏可以將最後一段代碼放在控制器中?另外,它是否適合我的'@ T'構造? – REMESQ

+0

+1描述屬性和refelction –

+0

@REMESQ是的,你的例子中的'x'是枚舉值,對吧?所以它會是'x.GetDescription()'或其他。它應該與T構造一起工作,因爲'T'只需要一個字符串參數:'T(x.GetDescription()'。 – McGarnagle