C# MVC:MVC Html Helpers与视图中的直接HTML相比的性能和优势

17

我想知道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助手有什么真正的优点吗?


1
非常好的问题。使用HTML时,它会直接加载到客户端机器上。但是,使用Helper调用静态方法可以从服务器呈现值。 - Sakthi Karthik
5个回答

15

人们常常担心反射的开销。但除了合成基准测试,这个话题就变得相当无聊了!

在实际生产应用中(例如对数据库执行CRUD操作或消费WebService),使用html辅助器的开销与进行这种上下文切换的开销相比将是微不足道的。

毫不用担心,特别是考虑到html辅助器提供的好处,例如自动从ViewData / Model恢复表单值和验证支持。

结论:尽可能使用html辅助器。 如果您遇到需要解决的罕见限制,始终可以使用纯HTML。


3
简而言之——不要过早优化! - womp
3
这并没有回答发帖者的问题。性能/开销不是“无聊的话题”,它不仅对了解进程工作方式至关重要,而且还可以创造优化和高效的代码。此外,发帖者没有询问与CRUD操作相关的性能,因此给出的解释是无用和毫无意义的。“真的不是什么需要担心的事情,特别是考虑到好处…” - 是的,这是需要担心的事情,无论有何好处。始终为性能编写代码,更好的性能意味着更少的服务器资源支出和更快乐的最终用户! - user1068477

7
使用Html Helpers的最大优势在于为您的标记提供抽象层。如果将来您想要更改标记结构,您只需要更改从Helpers生成的输出,而不是浏览所有视图并进行手动更改。
它还促进了开发团队之间的一致性。这些开发人员不需要知道UI基于哪些标记结构和css类的确切细节。
例如,我目前正在为我工作的公司开发一个基于Bootstrap的新UI框架。我创建了一组Html Helpers,用于生成各种Bootstrap组件的适当标记和css类。这都是在流畅的API中完成的,对于开发人员来说非常好用,无需深入了解Bootstrap,并且具有Intellisense可用的额外好处。
Telerik的 Kendo UI框架基于同样的概念。看看他们的一些代码示例。
关于反射和性能,考虑到少量HtmlHelper方法涉及的调用数量,我真的不会担心。请参见此post,了解原因。

2
我已经两种方式都尝试过了,性能似乎差不多。Phil Haack说你可以选择任何一种方式——帮助程序只是帮助工具,如果你愿意,可以编写普通的HTML。
我不确定帮助程序是否更安全......无论哪种方式,你最终都会在网页中得到相同的HTML......但是为某些原因,帮助程序中的智能感应似乎更好用,这很好。
使用帮助程序制作下拉菜单更容易,因为你不必为选择列表启动循环。对于包含多个属性的隐藏字段、文本框(以及链接),我觉得使用普通HTML更美观,特别是你可以避免对象初始化语法。
普通HTML似乎与jQuery很搭配( 在此处查看示例)。而且普通HTML更容易阅读。
我认为当您想要将一个较大的结构注入到HTML中时,辅助方法会非常有用。几个月后,您会发现网站上充满了这些方法,支持各种功能。想象一下只需一行代码就能将图表注入到您的页面中。

0

HtmlHelpers 没有反射。最后一个参数不是对象,而是字典,因此值的查找是通过哈希表而不是反射进行的。HtmlHelper 很好,因为它的方法是安全的和可靠的...必要时输入被编码,必要时执行安全检查等等。HtmlHelpers 不仅仅是 HTML 渲染。


IntelliSense明确表示反射。Html.TextBox的第3个重载与对象htmlAttributes一起声明“包含元素的HTML属性的对象。通过检查对象的属性来使用反射检索属性。通常使用对象初始化语法创建。”这正是我在上面的示例中所做的,也是Html.*的99%示例中的内容。因此,我会说它确实使用了反射。自己测试,添加Html.TextBox并转到第三个参数。 IntelliSense将具有上述精确文本。 - Alex
从反射器中可以看出,属性保存在一个字典中:private static string InputHelper(this HtmlHelper htmlHelper, InputType inputType, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes)。 - jrista
糟糕,签名错误:public static string TextBox(this HtmlHelper htmlHelper, string name, object value, IDictionary<string, object> htmlAttributes)。 - jrista

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接