2016-06-20 9 views
0

DisplayNameプロパティのドロップダウンリストの値にDataAnnotationsを使用して値を設定しているDisplayプロパティが正しく表示されますが、データベースからデータを取得するときには値は表示されません。 DataAnnotations.How私は私のビューで表示値を取得できます。 Html.DisplayFor @私の列挙ここGet Enum asp.netのテーブルから値を表示するMVCビュー

public enum CareerLevel 
     { 
      [Display(Name = "Entry Level")] 
      Level1, 
      [Display(Name = "Experienced Professional")] 
      Level2, 
      [Display(Name = "Department Head")] 
      Level3  
     } 

iが "エントリーレベル" のような値を表示したい私の見解である

(modelItem => item.CareerLevel)

それはレベル1を示し代わりに入門レベル 。どのような変更を私のビューまたはenumで行う必要がありますか?

+0

[この回答](http://stackoverflow.com/a/9329279/717088)の内線番号を使用して問題を解決できますか? –

+0

私は、ビューの拡張メソッドを呼び出すよりもはるかにクリーンであるように、重複したフラグでリンクされた新しい表示テンプレートのフォーマットを作成することが最もきれいな実装だと考えています。 – user1666620

+0

ビューに何も変更せずにこの問題を解決してくださいhttp://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC – Fahad

答えて

0

これを行う拡張メソッドを作成できます。

public static class Extensions 
{ 

public static TAttribute GetAttribute<TAttribute>(this Enum enumValue) 
     where TAttribute : Attribute 
{ 
    return enumValue.GetType() 
        .GetMember(enumValue.ToString()) 
        .First() 
        .GetCustomAttribute<TAttribute>(); 
} 
} 

このように使用できます。

var level = CareerLevel.Level1 

var name = level.GetAttribute<DisplayAttribute>().Name; 

独自のコードでは、このようなものを使用できます。あなたが拡張メソッドを使用したいwhereever

@Html.DisplayFor(modelItem => item.CareerLevel.GetAttribute<DisplayAttribute>().Name) 

あなたの拡張クラスの名前空間を参照する必要があります。私の場合、次の拡張メソッドで

0

を使用している:

私は、次の表記法を使用し、その後ビューで
public static class MVCExtentions 
{ 

public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression) 
{ 
    if (expression.Body.NodeType == ExpressionType.Call) 
    { 
     MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body; 
     string name = GetInputName(methodCallExpression); 
     return name.Substring(expression.Parameters[0].Name.Length + 1); 

    } 
    return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1); 
} 

private static string GetInputName(MethodCallExpression expression) 
{ 
    MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression; 
    if (methodCallExpression != null) 
    { 
     return GetInputName(methodCallExpression); 
    } 
    return expression.Object.ToString(); 
} 

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
{ 
    string inputName = GetInputName(expression); 
    var value = htmlHelper.ViewData.Model == null ? default(TProperty): expression.Compile()(htmlHelper.ViewData.Model); 
    return htmlHelper.DropDownList(inputName, ToSelectList(typeof(TProperty), value.ToString())); 
} 
} 

次のように

@Html.EnumDropDownListFor(model => model.CareerLevel, new { @class = "form-control" }) 

私のViewModelに見えます:

[EnumDataType(typeof(CareerLevel))] 
[Display(Name = "Level")] 
[DefaultValue(CareerLevel.Level1)] 
public CareerLevel CareerLevelType { get; set; } 

私は少し助けてくれることを願っています...

関連する問題