如何保存枚举 mvc 的字符串值



我是MVC的新手。 我在订单表中使用以下枚举:

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

在模型中:

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

在视图中:

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

我的问题是我想保存枚举的字符串值,而不是它的整数值。 这样就可以更轻松地在报表和其他视图中显示枚举的字符串值。 我一直在研究这个问题,但没有成功找到一种可以使用的技术。 任何帮助将不胜感激。

您可以使用帮助程序类尝试获取 Display 属性的值(如果枚举成员存在(,如果未找到,则可以回退以调用 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);
}

希望这有帮助!

最新更新