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

问题描述 投票:0回答:3

我想显示一个索引样式视图,其中包含一个 HTML 表格,该表格是我从我的

@model
List<MyViewModel>
填充的。

MyViewModel
类有一个名为 Status 的属性,它是我定义的自定义枚举,如下所示:

public enum MarketingEmailStatus
{
    Queued,
    Sending,
    Sent
}

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

        ...

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

我收到错误(在智能感知中和运行时):

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

我尝试做

item.Status.ToString()
但无济于事。

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

@Html

 辅助方法可用。)

asp.net-core-2.0
3个回答
1
投票
我发现直接使用@item.Status有两个问题:

  • 它不会尊重这些枚举的“显示值”,例如代替 “Code Sample”,就会显示“CodeSample”。

  • 它没有考虑本地化。

在我看来,这对于此类场景来说是一个非常有前途的解决方案。

如果您不关心第 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(); } }
    

0
投票
在 ASP.NET Core 中,尤其是在我自己的 Web 应用程序中(自 ASP.NET Core 2.0 以来我们都以某种方式不断升级)我所做的只是使用

Model

 中的变量名称,并在 上执行了 
@
剩下的事情由 ASP.NET Core 2.0 处理。让我感到非常惊讶的是,为什么您仍然使用这些 
Html
 帮助程序,而不是 ASP.NET 提供的最好的帮助程序。 :-) 是的,对于 
select
 元素,有一个特殊的 ASP.NET Core 标记帮助器,它采用模型,在简单文本显示的情况下,您可以执行 
@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 }

现在,在“视图”页面上,捕获模型后我执行以下操作,

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

在那里,它会自动打印包含枚举值的字符串。

如您所见,段落中的最后一行显示

文章有 6 个视图。这是我选择的项目的响应。 图像中的其余内容可以忽略

现在,只要给出一个表格的想法,这将非常有效 - 并且它确实适用于网络应用程序中的仪表板面板。

<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>

不需要引入 lambda 来完成如此简单的任务 - 我的意思是,不需要

@Html

 助手,因为 Razor 已经足够而且也很智能。 


0
投票
我遇到了完全相同的问题,需要在行中显示状态枚举。我想在状态附近显示一个小彩色图标,并且我在应用程序的很多地方都需要这个图标。

我是这样解决的: 我在共享文件夹中创建了 DisplayTemplate,名称为 StatusEnum.cshtml。在视图中我将其设置为:

@foreach (var item in Model) { <tr> <td> @Html.DisplayFor(x => x.First(x => x.Id == item.Id).Status, "StatusEnum", null, null) </td>
这不是最好或最有效的方法,但它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.