5

我需要在 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))))

我有点迷失如何从枚举的值中只获得一个名称。

感谢您的帮助。

4

4 回答 4

8

您的问题不是很清楚该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));
    }
}
于 2013-03-31T15:39:47.543 回答
3

编辑:

您可以简单地尝试这种方式。请在您的控制器类中尝试我的以下代码

控制器:

int enumvalue=(int)(YourModel.Status)// this property must be integer value only
var checkStatusName= Enum.GetName(typeof(CheckStatus), enumvalue);
于 2013-03-31T15:39:29.583 回答
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)
于 2015-03-12T18:14:23.220 回答
1

如果您的属性未声明为 int 类型,而是您正在使用的枚举类型,则使用 razor/MVC 您可以“免费”获得。

Darin 解决方案的问题是,虽然它对我有用,但如果我使用 int 类型,我无法在视图中看到我的其他字段 @Html.EditorFor(...)。

于 2016-01-05T14:17:04.923 回答