我应该在C#mvc中使用DisplayNameFor方法还是避免使用它?

时间:2013-09-20 04:48:30

标签: c# asp.net-mvc asp.net-mvc-4 .net-4.0 .net-4.5

在自动生成的视图中,我可以看到几行:

<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.RestarauntName)
    </th>
</tr>

我想写这样的东西:

<table>
@{
            <th>
                 @typeof(Tutorial.Models.RestarauntReview).GetProperty("RestarauntName").Name
             </th>
        }

它也有效!

所以我的猜测是DisplayNameFor()方法使用反射来查找相应属性的名称。

这是我打破了我的想法。

  1. 使用反射的成本是多少?

  2. 对于我们想要快速渲染的较小视图,我们只需输入属性的名称吗? (硬编码?)

1 个答案:

答案 0 :(得分:2)

  

所以我的猜测是DisplayNameFor()方法使用反射

我怀疑不是直接的。更有可能的是使用ModelMetaData(如果你遵循这条路线,毫无疑问最终会使用反射)。

  

对于我们想要快速渲染的较小视图,我们只需输入属性的名称吗?

你可以。对于一个相当小而且不变的项目来说可能没问题,但我不一定会推荐它。

  

使用反射的成本是多少?

我认为你会发现它对大多数用途来说都是微不足道的。除非它成为一个问题(鸭子,递归!),这是其中一个不关心的案例。

更大的担忧是:反思是实现目标的最佳途径吗?我认为这是你应该问的问题。反射非常有趣(我知道),但它也有点难以阅读,并且很难调试。这就是为什么如果有替代方案,最好避免它。在这种情况下,有: ModelMetaData

我的意思是:尝试使用HTML帮助,如果他们没有完全按照您的意愿行事,那么请尝试扩展它们并创建自己的。尝试爱上Display Templates and Editor Templates并将它们与ModelMetaData一起使用。

在Razor View中使用反射的问题在于你在视图中放错了东西。 Views should be stupid - 意思是他们不应该有任何逻辑,或者真的在做任何事情。您只需传递视图数据,它们就会为您显示。

我问了一些你可能感兴趣的(稍微相关的)问题Are HTML helpers worth using with complex markup?