【问题标题】:Should I use DisplayNameFor method in C# mvc or avoid it?我应该在 C# mvc 中使用 DisplayNameFor 方法还是避免它?
【发布时间】:2013-09-20 04:48:30
【问题描述】:

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

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

我想写这样的东西:

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

它也奏效了!

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

这是我头疼的事情。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我怀疑不是直接的。更有可能是使用ModelMetaData(如果您跟踪线索,它最终无疑会使用反射)。

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

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

    使用反射的成本是多少?

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

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

    我的意思是:尝试使用 HTML Helpers,如果它们不能完全满足您的需求,请尝试扩展它们并创建您自己的。尝试爱上Display Templates and Editor Templates 并将它们与 ModelMetaData 结合使用。

    在 Razor 视图中使用反射的问题在于您在视图中放置了错误的内容。 Views should be stupid - 意味着他们不应该有任何逻辑,或者真的“做很多”任何事情。您只需传递视图数据,它们就会为您显示。

    我问了一个(稍微相关的)问题Are HTML helpers worth using with complex markup?,您可能会觉得很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2017-06-13
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多