我是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);
}
希望这有帮助!