我想显示一个索引样式视图,其中包含一个 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
辅助方法可用。)
在我看来,这对于此类场景来说是一个非常有前途的解决方案。
如果您不关心第 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();
}
}
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 已经足够而且也很智能。
我是这样解决的: 我在共享文件夹中创建了 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>
这不是最好或最有效的方法,但它对我有用。