我需要在DisplayFor HtmlHelper中显示相应值的枚举名称。我有以下枚举:
public enum CheckStatus
{
Yes = 1,
No = 2,
Maybe =3
}
我正在显示通常像这样的模型的值:
@Html.DisplayFor(modelItem => item.Name)
问题在于,我有一点:
@Html.DisplayFor(modelItem => item.Status)
该行仅显示从枚举(1,2或3)之前设置的状态值。而不是我需要以某种方式显示该值的名称。因此,如果状态代码为2,我想显示“否”,而不是数字2。
当我填充下拉列表时,我遇到了类似的问题,我设法解决了这个问题:
@Html.DropDownListFor(model => model.Item.Status,
new SelectList(Enum.GetValues(typeof(Pro.Web.Models.Enums.CheckStatus))))
我对如何从枚举值中仅获取一个名称感到有点迷失。
感谢您的帮助。
答案 0 :(得分:7)
从您的问题中不清楚Status
属性的基础类型是什么。如果是CheckStatus
,则@Html.DisplayFor(modelItem => item.Status)
会准确显示您的预期。另一方面,如果它是一个整数,你可以编写一个自定义助手来显示正确的值:
public static class HtmlExtensions
{
public static IHtmlString DisplayEnumFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> ex, Type enumType)
{
var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
string enumValue = Enum.GetName(enumType, value);
return new HtmlString(html.Encode(enumValue));
}
}
然后像这样使用它:
@Html.DisplayEnumFor(modelItem => item.Status, typeof(CheckStatus))
让我们假设你想让这个助手更进一步,并考虑你的枚举类型的DisplayName属性:
public enum CheckStatus
{
[Display(Name = "oh yeah")]
Yes = 1,
[Display(Name = "no, no, no...")]
No = 2,
[Display(Name = "well, dunno")]
Maybe = 3
}
以下是扩展我们的自定义助手的方法:
public static class HtmlExtensions
{
public static IHtmlString DisplayEnumFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> ex, Type enumType)
{
var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
string enumValue = Enum.GetName(enumType, value);
var field = enumType.GetField(enumValue);
if (field != null)
{
var displayAttribute = field
.GetCustomAttributes(typeof(DisplayAttribute), false)
.Cast<DisplayAttribute>()
.FirstOrDefault();
if (displayAttribute != null)
{
return new HtmlString(html.Encode(displayAttribute.Name));
}
}
return new HtmlString(html.Encode(enumValue));
}
}
答案 1 :(得分:3)
修改强>
你可以这样试试。请在您的控制器类中尝试以下代码
控制器:
int enumvalue=(int)(YourModel.Status)// this property must be integer value only
var checkStatusName= Enum.GetName(typeof(CheckStatus), enumvalue);
答案 2 :(得分:1)
将@DarinDimitrov代码改编为显示模板。
如果你有
public enum CheckStatus
{
[Display(Name = "oh yeah")]
Yes = 1,
[Display(Name = "no, no, no...")]
No = 2,
[Display(Name = "well, dunno")]
Maybe = 3
}
public class MyModel
{
public CheckStatus Status { get; set; }
}
将以下内容放入Views / DisplayTemplates / Enum.cshtml:
@using System.ComponentModel.DataAnnotations
@model object
@{
var value = Model.ToString();
var field = Model.GetType().GetField(value);
if (field != null)
{
var displayAttribute = field
.GetCustomAttributes(typeof(DisplayAttribute), false)
.Cast<DisplayAttribute>()
.FirstOrDefault();
if (displayAttribute != null)
{
value = displayAttribute.GetName();
}
}
}
@value
现在你只需在你的视图中写下:
@Html.DisplayFor(model => model.Status)
答案 3 :(得分:1)
使用razor / MVC,如果您的属性未声明为int类型,而是作为您使用的枚举类型,则可以获得“免费”。
我对Darin解决方案的问题是虽然如果我使用int类型它对我有用,但我无法在视图中看到我的其他字段@ Html.EditorFor(...)。