且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ASP.NET MVC视图中的@Html.xxx(...)

更新时间:2022-09-18 22:20:51

问题

在视图页中@Html.xxx(...)是什么?如何被执行?

如下图所示:
ASP.NET MVC视图中的@Html.xxx(...)

解疑

视图页中@Html.xxx(...)涉及的内容有:

  • 视图页被编译后的类继承自 WebViewPage<T>:WebViewPage:WebPageBase:WebPageRenderingBase:WebPageExecutingBase
  • 在进行View呈现过程中,创建视图页对象实例,此时 初始化了一个HtmlHelper对象,并赋值给其父类的一个名为Html的属性,@Html.xxx(...)中的Html就是该属性
  • 视图页中的@Html.xxx(...),经过编译之后,则变成该视图页对象Execute方法中的一段代码,即:this.Write(this.Html.xxx(xxx));
  • xxx是HtmlHelper类的扩展方法

以@Html.TextBox(...)为例进行详细分析:

  在ASP.NET MVC 中,视图页都被编译成继承自WebViewPage<T>的类,而在进行 View呈现 的过程中,需要通过反射创建视图页类的实例(Object类型),然后再将该实例转换为WebViewPage类型,并进行一些初始化操作,就在初始化时,创建了HtmlHelper对象,并赋值给其属性Html。

ASP.NET MVC视图中的@Html.xxx(...) 创建视图页对象-->转换为WebViewPage类型
ASP.NET MVC视图中的@Html.xxx(...) WebViewPage

 “_Index.cshtml”经编译后的结果为:

ASP.NET MVC视图中的@Html.xxx(...)ASP.NET MVC视图中的@Html.xxx(...)

  如上图所示,“@Html.TextBox(‘txtUser’)” 经过编译后,就是去执行base.Html.TextBox("txtUser"),又由类继承关系可知,base.Html的值就是一个HtmlHelper对象(视图页对象转换为WebViewPage类型后,初始化时创建的)。而TextBox("txtUser"),则是HtmlHelper的扩展方法!

ASP.NET MVC视图中的@Html.xxx(...) InputExtensions

  代码中,TextBox等扩展方法最终调用InputHelper方法,从而生成对应字符串类型的html标签(如:<input type='text"...>),然后将标签封装到一个MvcHtmlString对象中,并返回。即:base.Html.TextBox("txtUser")的执行结果就是一个封装了html标签内容的MvcHtmlString对象。之后执行this.Write(base.Html.TextBox("txtUser"))时,会执行MvcHtmlString对象的 ToHtmlString()方法获取html标签,最终将标签内容写入到响应给客户端的内容中!

ASP.NET MVC视图中的@Html.xxx(...) IHtmlString
ASP.NET MVC视图中的@Html.xxx(...) HtmlString
ASP.NET MVC视图中的@Html.xxx(...) MvcHtmlString

 以下展示如何从MmvHtmlString对象中得到被封装的html标签(如:<input type='text"...>),并写入到Http响应内容中!ASP.NET MVC视图中的@Html.xxx(...)

 最终,将生成的html标签以字符串的形式写入到Http响应内容中!

 以上只对HtmlHelper的扩展方法TextBox进行了介绍,其他的扩展方法童鞋们自行补脑了!上述如有不适之处,请指正!!!

扩展:

  可以通过创建一个HtmlHelper的扩展方法,从而实现一个自定义控件!

 

 


本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/p/3511526.html,如需转载请自行联系原作者