2017-05-10 5 views
2

私はMVCを初めて使用しています。enum mvcの文字列値を保存するには

public enum OrderStatus 
    { 
     Pending = 1, 
     Held = 2, 
     [Display(Name = "In Process")] 
     In_Process = 3, 
     Completed = 4, 
     Shipped = 5, 
     Returned = 6, 
     Cancelled = 7 
    } 

とモデルに:私は私のOrdersテーブルには、次の列挙型を使用しています

   <div class="form-group"> 
        @Html.LabelFor(model => model.OrderStatus, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-10"> 
         @Html.EnumDropDownListFor(model => model.OrderStatus, 
           "--Select--", 
           new { @class = "form-control ingUOM" }) 
          @Html.ValidationMessageFor(model => model.OrderStatus, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

コントローラで:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(OrderViewModel ovm, int id) 
... 

Order order = db.Orders.FirstOrDefault(o => ((o.OrderId == id))); 

       order.OrderStatus = ovm.OrderStatus; 
ビューで

public class Order 
    { 
     ... 
     public OrderStatus OrderStatus { get; set; } 
    { 

私の問題は、私がtを保存したいということです彼はその整数値の代わりに列挙型の値を文字列にします。これは、レポートやその他のビューで列挙型の文字列値を表示する方が簡単になるためです。私はこれを研究していますが、使用する技術を見つけることに失敗しました。どんな助けでも大歓迎です。

+0

あなたの列挙型で 'ToString()'メソッドを試しましたか? – greenjaed

+0

明示的な例がありますか?例えば、 –

+0

。 'OrderStatus.ToString()'(変数、列挙型ではない) – greenjaed

答えて

1

表示属性が存在する場合はヘルパークラスを使用し、見つからない場合はToString()を呼び出すようにすることができます。

using System; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 

... 

public static class DisplayAttributeHelper 
{ 
    public static string ReadDisplay(Enum target) 
    { 
     var attrs = target.GetType().GetMember(target.ToString()) 
      .First() 
      .GetCustomAttributes(typeof(DisplayAttribute), false) 
      .Cast<DisplayAttribute>(); 

     foreach (var attr in attrs) 
      return attr.GetName(); 

     return target.ToString(); 
    } 
} 

今、あなたは文字列値は、ヘルパークラスを呼び出す表示するために必要がある場合EFまたはLINQを使用して、通常はあなたの列挙型の値を格納しておくことができます。このような何かはトリックを行う必要があります。報告書では、レポートモデルを作成することができることを示すために例えば

public class ReportModel 
{ 
     public OrderStatus OrderStatus { get; set; } 

     public string OrderStatusDisplayText => DisplayAttributeHelper.ReadDisplay(OrderStatus); 
} 

・ホープ、このことができます!