ASP.NET WebForm页面内容输出其实是一个非常旧的话题了,不过这个话题的适用范围很广,可以应用到最新的ASP.NET MVC框架上,而且会遇到更多。本文对其中的细节进行了分析。

老赵前日的这篇博文讲的是有关ASP.NET WebForm页面内容输出办法的内容。虽然这个论题很老,不过在ASP.NET MVC中相同适用,并且适用的状况有增无减,因而十分重要。期望这篇文章能够协助你更好的了解ASP.NET WebForm页面内容输出的细节。

WebForm页面内容输出的细节剖析  WebForm页面内容输出 ASP.NET MVC 第1张

这次咱们谈的论题是“WebForm页面上输出内容的办法”。这其实是一个十分旧的论题了,由于本文的内容乃至能够运用于ASP.NET 1.1之上。不过这个论题的适用范围很广,由于即便是现在***的ASP.NET MVC结构,它的默许视图引擎依旧是根据ASP.NET WebForm的(如Page,Control,MasterPage)。乃至说,由于ASP.NET MVC结构的特性,咱们会遇到更多在页面上“直接输出”内容的状况。因而,这个论题在ASP.NET MVC运用中或许由为重要。

那么就拿ASP.NET MVC举例吧。假设,咱们在页面上生成一个Partial View,咱们能够这么做:

  1. <%Html.RenderPartial("MyPartialView");%>

可是,在前一篇文章中咱们提出了一个新的办法Partial,它回来一个字符串,它能够在页面上这样运用:

  1. <%=Html.Partial("MyPartialView")%>

一个aspx页面会被编译成Page类的一个子类,这个子类的首要“功用”是覆盖了基类的Render办法:

  1. publicclassMyPage:Page
  2. {
  3. protectedoverridevoidRender(HtmlTextWriterwriter)
  4. {
  5. ...
  6. }
  7. }

咱们平常在aspx页面中编写的许多内容,其实都会变成操作writer的代码。例如运用writer.Write办法输出内容,或许把writer交给子控件的Render办法用于生成内容。那么,以上两种页面上的符号别离又是怎么操作writer的呢?

  1. <%=expression%>

首先是< %= %>符号。< %= %>符号内包括的是一个“表达式”,因而它不能以分号结束。表达式内部的数据就会直接写入writer。例如这样的符号:

  1. <%=DateTime.Now%>

在编译往后就成为:

  1. writer.Write(DateTime.Now)

与< %= %>符号不同,< % %>符号中心其实包括的是“句子”。句子天然能够有多行,天然每行***需求有分号,这就像咱们平常写C#代码那样。不过实际上,句子的功用其实并不是为了“输出内容”,而是用来“操控逻辑”。例如,您在页面上写了这样的代码:

  1. <%Func<int,bool>odd=i=>i%2!=0;%>

这样就相当于您在Render办法内部声明晰一个局部变量odd,它的类型是一个Func< int, bool>托付。而假如您编写这样的代码:

  1. <%for(inti=0;i<10;i++){%>
  2. <span>
  3. <%=i+1%>
  4. </span>
  5. <%}%>

则生成的Render办法中就会包括:

  1. for(inti=0;i<10;i++)
  2. {
  3. writer.Write("<span>");
  4. writer.Write(i+1);
  5. writer.Write("</span>");
  6. }

假如是写在页面上的一般HTML符号,编译后就被当作一般字符串来处理了。有些朋友一向谈“客户端控件”等等,其实假如一个元素上没有runat="server"符号,ASP.NET仅仅把它们当作一般字符串处理,并不会有任何“HTML元素”的概念。当然,上面的代码体现的是“目的”,事实上在编译往后aspx页面中的空格和换行等字符也会包括在输出的内容中1。

那么,已然< % %>中包括的是用来操控逻辑的句子,自身不是用来表明输出的,那么为什么方才代码中的Html.RenderPartial办法也会生成页面内容呢?那是由于RenderPartial办法直接向当时HttpContext.Response.Output里写入字符了。许多朋友常常运用Response.Write来输出内容,其实在Write办法内部便是输出到Output中。

事实上,即便咱们的页面中运用了HtmlTextWriter来输出内容,但它内部也是封装了Output所暴露出的TextWriter中。为了验证,您能够在代码中设置断点并调查Render办法的writer参数,在“正常状况下”能够发现writer.InnerWriter特点是一个HttpWriter目标,这是个TextWriter的子类,也是ASP.NET中界说的内部类型。

这便是ASP.NET WebForm页面内容输出的细节。那么请问,以下两种输出办法的差异是什么呢?

  1. <%="HelloWorld"%>
  2. <%Response.Write("HelloWorld");%>

从作用上看,两者没有任何差异。可是实际上前者是运用页面的HtmlTextWriter目标输出的,而后者则直接向Response.Output里输出内容。这个差异看似不重要,但其实它会涉及到咱们许多开发过程中可用的实践办法。在往后的文章中,我会提出生成页面内容的一些原则,解说这些原则的原因,并指出ASP.NET MVC自身是怎么损坏这些规划原则的。

天然,修正版别的ASP.NET MVC会发布在MvcPatch项目中。

【修改引荐】

  1. 处理WebForm未界说的原因及办法
  2. WebForm中的ListBox组件编程
  3. ASP.NET MVC与WebForm差异谈
  4. ASP.NET Routing之“解析URL”功用详解
  5. 为ASP.NET MVC运用增加自界说路由
转载请说明出处
知优网 » WebForm页面内容输出的细节剖析

发表评论

您需要后才能发表评论