C#MVC:MVC Html助手相对于视图中直接Html的性能和优势

C#MVC:MVC Html助手相对于视图中直接Html的性能和优势,c#,asp.net-mvc,C#,Asp.net Mvc,我想知道Html助手对C#ASP.NET MVC视图有什么样的性能影响,特别是在设置属性参数时,以及它们总体上有什么样的优势(为什么使用它们?) 使用Html帮助程序: <%= Html.TextBox("firstName", Model.FirstName, new { @disabled = "disabled", @class = "myCssClass" }) %> 直接Html: <input type="text" class="myCssClas

我想知道Html助手对C#ASP.NET MVC视图有什么样的性能影响,特别是在设置属性参数时,以及它们总体上有什么样的优势(为什么使用它们?)

使用Html帮助程序:

<%= Html.TextBox("firstName", Model.FirstName, 
    new { @disabled = "disabled", @class = "myCssClass" }) %>

直接Html:

<input type="text" class="myCssClass" name="firstName" 
     disabled="disabled" text="<%= Model.FirstName %>"/>

我有相当多的页面包含5到15个这样的输入。除此之外,Html帮助程序还允许您呈现表单(想想Html.BeginForm())等,因此最终可能会有20个甚至更多的Html帮助程序调用。我认为其中一些也使用反射,例如,当您设置上面禁用的属性时

这样做是否会对性能产生巨大影响?究竟为什么使用这些助手被认为是更好的做法?请有人给我一个很好的理由:)我想使用它们,但我真的担心它们对性能的影响


使用Html帮助程序有什么真正的好处吗?

使用Html帮助程序没有任何反映。最后一个参数不是对象,而是字典,因此值的查找是通过哈希表进行的,而不是反射。HtmlHelper很好,因为它的方法安全可靠……必要时对输入进行编码,必要时进行安全检查,等等。HtmlHelper的功能远不止是html呈现。

进行反射的开销是人们真正喜欢担心的。然而,在合成基准之外,它变成了一个相当无聊的话题

在实际生产应用程序的上下文中(例如,您正在对数据库执行CRUD操作或使用Web服务),与执行这种上下文切换的开销相比,使用html帮助程序的开销将是微不足道的

特别是考虑到html助手提供的好处,例如从ViewData/Model自动恢复表单值,以及验证支持,真的不需要担心


底线:尽可能使用html帮助程序。如果您遇到一个罕见的限制需要解决,您可以始终使用直接html。

我用两种方法都做到了,性能似乎差不多。说你可以用任何一种方式来做——助手就是这样,助手,如果你愿意,你可以编写简单的HTML

我不确定助手是否更安全……不管怎样,你最终在网页中使用相同的HTML……但出于某种原因,intellisense似乎在助手中工作得更好,这很好

使用帮助器可以更容易地创建下拉列表,因为您不必为选择列表旋转循环。在我看来,隐藏字段和文本框(以及链接)在纯HTML中看起来更好,尤其是当它们包含多个属性时,因为您可以避免对象初始化语法

普通HTML似乎与jQuery()很好地匹配。简单的HTML更容易阅读

我认为,当您想要向html中注入更大的结构时,helper方法非常有用。几个月后,你会发现网站上有丰富的这些方法,支持各种各样的功能。想象一下,能够用一行代码将图形注入页面。

在许多情况下,必须缓存控制器操作(由GET调用)结果才能获得良好的性能。因此,您不应该担心视图的执行时间。对我来说,很难想象HtmlHelper的执行时间会成为性能瓶颈

使用Html助手有什么真正的优势吗

我看到使用HtmlHelpers的最大优势是为标记提供了一个抽象层。如果将来要更改标记的结构,只需更改从帮助程序生成的输出,而不是遍历所有视图并进行手动更改

它还促进了开发团队之间的一致性。这些开发人员不需要知道UI所基于的标记结构和css类的确切细节

例如,我目前正在为我工作的公司开发一个基于Bootstrap的新UI框架。我创建了一组HTMLHelper,为各种引导组件生成适当的标记和css类。这一切都是在一个fluentapi中完成的,该API非常适合开发人员使用,而不需要对引导程序有任何深入的了解,另外还有Intellisense可用的额外好处

Telerik的框架基于相同的概念。看看他们的一些代码示例


至于反射和性能,考虑到一些HtmlHelper方法可能涉及的调用数量,我真的不会担心。请参阅此部分以了解原因。

IntelliSense明确表示反射。带有对象htmlAttributes的Html.TextBox的第三个重载声明“一个包含元素Html属性的对象。通过检查对象属性通过反射检索属性。通常使用对象初始值设定项语法创建。”。这正是我在上面的示例中所做的,也是所有Html示例中99%的内容。*。所以我想说它确实使用了反射。自己测试,添加Html.TextBox并转到第三个参数。IntelliSense将具有上面引用的确切文本。从reflector中,请注意属性在字典中:私有静态字符串InputHelper(此HtmlHelper HtmlHelper、InputType InputType、字符串名称、对象值、bool useViewData、bool isChecked、bool setId、bool isExplicitValue、IDictionary htmlAttributes),签名错误:简而言之,公共静态字符串文本框(此HtmlHelper HtmlHelper、字符串名称、对象值、IDictionary htmlAttributes)-不要预先优化!这并不能回答问题。性能/开销不是一个“无聊的话题”,不仅要了解流程是如何工作的,而且要创建优化和高效的流程