ASP.NET MVC Core - 在视图中显示枚举属性(与DropDownList无关)

时间:2017-09-03 22:15:17

标签: asp.net-core-2.0

我想显示一个索引样式视图,其中包含我从@model填充的HTML表格,List<MyViewModel>

MyViewModel类有一个名为Status的属性,这是我定义的自定义枚举:

public enum MarketingEmailStatus
{
    Queued,
    Sending,
    Sent
}

当我尝试在我的视图中显示该属性时......

        ...

        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayForModel(modelItem => item.Status)
                </td>
         ...

我收到错误(在Intellisense和运行时):

Cannot convert lambda expression to type 'object' because it is not a delegate type

我试图item.Status.ToString()无济于事。

毫无疑问,我可以采取另一种方法(即,只需更改ViewModel以将Status表示为字符串并在发送到视图之前解决此问题),但这感觉就像这样一个简单的场景,它应该是可能的。然而,经过一个小时的搜索,我找不到任何解决方案(除了与DropDownLists相关的解决方案,似乎有一些@Html辅助方法可用。)

2 个答案:

答案 0 :(得分:1)

我直接使用@ item.Status看到了两个问题:

  • 它不会尊重&#34;显示值&#34;那些枚举,例如代替 &#34;代码示例&#34;,它将显示&#34; CodeSample&#34;。

  • 它没有考虑到本地化。

在我看来,

This看起来是一个非常有前景的解决方案。

如果您不关注第2点,您显然可以使用扩展方法:

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum enumValue)
    {
        FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString());
        var displayAttribute = fi.CustomAttributes.FirstOrDefault(c => c.AttributeType == typeof(DisplayAttribute));
        if (displayAttribute == null) return enumValue.ToString();
        return displayAttribute.NamedArguments.FirstOrDefault(a => a.MemberName == "Name").TypedValue.Value.ToString();
    }
}

答案 1 :(得分:0)

在ASP.NET Core中,特别是在我自己的Web应用程序中 - 自从ASP.NET Core 2.0天以来我们一直在不断升级 - 我所做的只是使用了来自Model的变量名称并且做了一个@就此而言,ASP.NET Core 2.0负责其余部分。令我非常惊讶的是,为什么你仍然使用这些Html助手,而不是ASP.NET提供的最好的帮助。 :-)是的,对于select元素,有一个特殊的ASP.NET核心标记助手,它接受模型,如果是简单的文本显示,你可以@propertyName,它将是为你写的。

让我与您分享必要的模型内容,

public class Foo {
    // Other properties
    public int Views { get; set; } 
    public PostType PostType { get; set; }
    // Other properties.
}

枚举是这样的,

public enum PostType { Article, Video, CodeSample, Ebook, Other }

现在,在View页面上,我在捕获模型后执行以下操作,

<!-- Content here. -->
<p>@post.PostType has @post.Views views.</p>
<!-- Content here. -->

然后,它会自动打印包含枚举值的字符串。

enter image description here

如您所见,段落中的最后一行显示文章有6个视图。这是我选择的项目的响应。 图像中的其他内容可以忽略

现在,只是简单介绍一个表格,这样就可以完美运行 - 它确实适用于我在Web应用程序中的仪表板面板。

<table>
   <tr>
      <th>Id</th>
      <th>Title</th>
      <th>Status</th>
   </tr>
   @foreach (var item in Model) {
      <tr>
         <td>@item.Id</td>
         <td>@item.Name</td>
         <td>@item.Status</td>
      </tr>
   }
</table>

没有必要为这么简单的任务引入lambdas - 我的意思是,不需要@Html帮助者,因为Razor也足够聪明。