如何保存枚举mvc

时间:2017-05-10 20:41:41

标签: c# asp.net-mvc enums

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

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;

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

1 个答案:

答案 0 :(得分:1)

如果找不到枚举成员,则可以使用帮助程序类来尝试获取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正常存储你的枚举值,当你需要显示字符串值时,可以调用helper类。

例如,要在报告中显示您可以创建报告模型:

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

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

希望这有帮助!