我想显示一个索引样式视图,其中包含我从@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
辅助方法可用。)
答案 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. -->
然后,它会自动打印包含枚举值的字符串。
如您所见,段落中的最后一行显示文章有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也足够聪明。