2017-05-10 1 views
2

Je suis nouveau à MVC. J'utilise le ENUM suivant dans ma table Orders:Comment enregistrer la valeur de chaîne de enum mvc

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

et dans le modèle:

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

dans la vue:

   <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> 

dans le contrôleur:

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

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

       order.OrderStatus = ovm.OrderStatus; 

Mon problème est que je veux sauver t La valeur de chaîne de l'enum, au lieu de sa valeur entière. C'est ainsi qu'il sera plus facile d'afficher la valeur de chaîne de l'énumération dans les rapports et autres vues. J'ai fait des recherches sur ce sujet, mais je n'ai pas réussi à trouver une technique à utiliser. Toute aide sera très appréciée.

+0

Avez-vous essayé la méthode 'ToString()' sur votre énumération? – greenjaed

+0

Pouvez-vous donner un exemple explicite de ceci? –

+0

par exemple. 'OrderStatus.ToString()' (la variable, pas le type enum) – greenjaed

Répondre

1

Vous pouvez utiliser une classe d'assistance pour essayer d'obtenir la valeur de l'attribut Display s'il existe pour le membre enum et fallback pour appeler ToString() s'il n'est pas trouvé. Quelque chose comme ça devrait faire l'affaire:

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(); 
    } 
} 

Maintenant, vous pouvez continuer à stocker votre valeur ENUM en utilisant normalement EF ou LINQ et quand vous avez besoin de montrer la valeur de chaîne appeler la classe d'aide.

Par exemple, pour montrer que, dans un rapport, vous pouvez créer votre modèle de rapport:

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

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

Hope this helps!