Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何找到对应值的枚举名称并在DisplayFor中使用它?_Asp.net_Asp.net Mvc_Razor_Asp.net Mvc 4_Enums - Fatal编程技术网

Asp.net 如何找到对应值的枚举名称并在DisplayFor中使用它?

Asp.net 如何找到对应值的枚举名称并在DisplayFor中使用它?,asp.net,asp.net-mvc,razor,asp.net-mvc-4,enums,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 4,Enums,我需要在DisplayFor HtmlHelper中显示对应值的枚举名称。我有以下枚举: public enum CheckStatus { Yes = 1, No = 2, Maybe =3 } 我正在显示模型的值,通常如下所示: @Html.DisplayFor(modelItem => item.Name) @Html.DropDownListFor(model => model.Item.Status,

我需要在DisplayFor HtmlHelper中显示对应值的枚举名称。我有以下枚举:

public enum CheckStatus
    {
        Yes = 1,
        No = 2,
        Maybe =3
    }
我正在显示模型的值,通常如下所示:

@Html.DisplayFor(modelItem => item.Name)
@Html.DropDownListFor(model => model.Item.Status,
                new SelectList(Enum.GetValues(typeof(Pro.Web.Models.Enums.CheckStatus))))
@Html.DisplayEnumFor(modelItem => item.Status, typeof(CheckStatus))
问题是,有一点我有:

@Html.DisplayFor(modelItem => item.Status)
该行仅显示从枚举(1、2或3)之前设置的状态值。相反,我需要以某种方式显示该值的名称。所以,如果状态代码是2,我想显示“否”,而不是数字2

在填充下拉列表时,我在获取枚举名称时遇到了类似的问题,我成功地解决了这个问题:

@Html.DisplayFor(modelItem => item.Name)
@Html.DropDownListFor(model => model.Item.Status,
                new SelectList(Enum.GetValues(typeof(Pro.Web.Models.Enums.CheckStatus))))
@Html.DisplayEnumFor(modelItem => item.Status, typeof(CheckStatus))
我对如何从枚举的值中仅获取一个名称有点迷茫

谢谢您的帮助。

编辑:

你可以这样简单地尝试。请在控制器类中尝试我下面的代码

控制器:

int enumvalue=(int)(YourModel.Status)// this property must be integer value only
var checkStatusName= Enum.GetName(typeof(CheckStatus), enumvalue);

您的问题并不清楚
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));
    }
}
让我们假设您想让这个助手更进一步,并考虑枚举类型上的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));
    }
}
public静态类
{
公共静态IHtmlString DisplayEnumFor(此HtmlHelper html,表达式ex,类型enumType)
{
var value=(int)modelmetada.FromLambdaExpression(ex,html.ViewData).Model;
字符串enumValue=Enum.GetName(enumType,value);
var field=enumType.GetField(enumValue);
如果(字段!=null)
{
var displayAttribute=字段
.GetCustomAttributes(typeof(DisplayAttribute),false)
.Cast()
.FirstOrDefault();
if(displayAttribute!=null)
{
返回新的HtmlString(html.Encode(displayAttribute.Name));
}
}
返回新的HtmlString(html.Encode(enumValue));
}
}

采用@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; }
}
将以下内容放入视图/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

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


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

看起来不是一个很好维护的解决方案。谢谢。我认为这可以工作,但我希望避免添加新代码,因为如果更改枚举,我将需要再次更改该代码。它可以工作。。!!但是通过GetName,我得到了值的名称。但是如果我想得到该值的显示名呢?状态是整数。状态只能有数字1、2和3。谢谢你的建议。我应该把这个助手类放在哪里?在项目根目录中的某个单独的新助手目录中,然后在视图中使用@using or?引用它。您可以在项目根目录下创建一个
Helpers
文件夹,并在那里定义扩展方法。此外,为了使此扩展方法在视图中可见,您需要将定义静态类的命名空间引入范围。这可以通过将此命名空间添加到
~/Views/web.config
中的
部分来实现(不要与
~/web.config
混淆)。您的代码风险更大。请查看我的新答案。其返回的枚举名称正确。int enumvalue=(int)(YourModel.Status)//此属性只能是整数值var checkStatusName=Enum.GetName(typeof(CheckStatus),enumvalue);我看不出我的代码比你的更危险。在这两种情况下,值必须是整数才能使代码正常工作。事实上,我的代码比你的代码更一般,因为它还可以处理短类型,这些类型可能是枚举的值,而在你的代码中,你正在强制转换为Int32。我目前正在尝试这个版本,然后我将尝试其他:)@DarinDimitrov-我将
放在
~/Views/web.config
中,但我仍然收到一条警告,
DisplayEnumFor
没有定义。您好,我如何使用您的解决方案获得显示值?[Display(Name=“Numérico”)]好的,我发现了问题,视图必须在视图/共享/显示模板/文件夹中才能工作