关闭顶部展开顶部

解析ASP.NET WebForm页面内容输出方式_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:揭秘.Net开发人员必知的八个网站
当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一,或者想要成为其中之一的话,我下面将要列出的每一个站点都应该是你的最爱,都应该收藏到书签中去。 对于不熟悉.NET技术的朋友,需要说明一下,.NET提供了一个平台和一些相应的工具,编程

就拿ASP.NET MVC举例吧。假如,我们在页面上生成一个Partial View,我们可以这么做:

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

然而,在前一篇文章中我们提出了一个新的方法Partial,它返回一个字符串,它可以在页面上这样使用:

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

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

public class MyPage : Page
{
    protected override void Render(HtmlTextWriter writer)
    {
        ...
    }
} 
 
我们平时在aspx页面中编写的大量内容,其实都会变成操作writer的代码。例如使用writer.Write方法输出内容,或者把writer交给子控件的Render方法用于生成内容。那么,以上两种页面上的标记分别又是如何操作writer的呢?

<%= expression %>

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

<%= DateTime.Now %>

在编译过后就成为:

writer.Write(DateTime.Now)

与<%= %>标记不同,<% %>标记中间其实包含的是“语句”。语句自然可以有多行,自然每行最后需要有分号,这就像我们平时写C#代码那样。不过实际上,语句的功能其实并不是为了“输出内容”,而是用来“控制逻辑”。例如,您在页面上写了这样的代码:

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

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

<% for (int i = 0; i < 10; i++) { %>
    <span>
        <%= i + 1 %>
    </span>
<% } %>

则生成的Render方法中就会包含:

for (int i = 0; i < 10; i++)
{
    writer.Write("<span>");
    writer.Write(i + 1);
    writer.Write("</span>");
}

如果是写在页面上的普通HTML标记,编译后就被当作普通字符串来处理了。有些朋友一直谈“客户端控件”等等,其实如果一个元素上没有runat="server"标记,ASP.NET只是把它们当作普通字符串处理,并不会有任何“HTML元素”的概念。当然,上面的代码表现的是“意图”,事实上在编译过后aspx页面中的空格和换行等字符也会包含在输出的内容中。

那么,既然<% %>中包含的是用来控制逻辑的语句,本身不是用来表示输出的,那么为什么刚才代码中的Html.RenderPartial方法也会生成页面内容呢?那是因为RenderPartial方法直接向当前HttpContext.Response.Output里写入字符了。很多朋友经常使用Response.Write来输出内容,其实在Write方法内部就是输出到Output中。

事实上,即使我们的页面中使用了HtmlTextWriter来输出内容,但它内部也是封装了Output所暴露出的TextWriter中。为了验证,您可以在代码中设置断点并观察Render方法的writer参数,在“正常情况下”可以发现writer.InnerWriter属性是一个HttpWriter对象,这是个TextWriter的子类,也是ASP.NET中定义的内部类型。

这便是ASP.NET页面输出的细节。那么请问,以下两种输出方式的区别是什么呢?

<%= "Hello World" %>
<% Response.Write("Hello World") %>

从效果上看,两者没有任何区别。但是实际上前者是使用页面的HtmlTextWriter对象输出的,而后者则直接向Response.Output里输出内容。这个区别看似不重要,但其实它会涉及到我们很多开发过程中可用的实践方式。在今后的文章中,我会提出生成页面内容的一些准则,解释这些准则的原因,并指出ASP.NET MVC本身是如何破坏这些设计准则的。

自然,修改版本的ASP.NET MVC会发布在MvcPatch项目中。

 

分享:浅谈ADO.NET Entity Framework存取数据库中图片
网站中的图片可以保存到文件系统中,即专门的目录用于图片的存放,这样的存储配上数据库中保存的图片路径信息,相信很多网站是这么选择的。这样的搭配由于存储和管理信息是分开的,其优点就是对数据库的性能不会产生太大影响,但是也正是由于这种分开网站的

来源:模板无忧//所属分类:.Net教程/更新时间:2009-10-29
loading.. 评论加载中....
相关.Net教程
闂佹眹鍩勯崹閬嶆偤閺囶澁缍栭柛鈩冪⊕閳锋帗銇勯弴妤€浜惧銈忕秶閹凤拷
濠电偛顕慨顓㈠磻閹炬枼妲堥柡鍌濇硶婢ф稒淇婇懠顒夆偓婵嬫煟閵忊晛鐏查柟鍑ゆ嫹
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径瀣閻庣懓瀚竟鍡欐崲娑斾線鏌i姀鈺佺伈闁瑰嚖鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勵吋闂佽鍨庨崟顓фК闂佽閰eḿ褍螞濞戙垺鍋夐柨鐕傛嫹
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ帒鍊哥敮鍫曞箹鐎涙ḿ鐭掔€规洘绻堥弫鎾绘晸閿燂拷
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ巻鍋撻柛姘儑缁﹪鏁傞崜褏鐓撻柣搴岛閺呮繈鎯屽▎鎴犵=濞撴艾锕ョ€氾拷
闂備浇銆€閸嬫挻銇勯弽銊р槈闁伙富鍣i弻娑樷攽閹邦亞鑳虹紓浣靛妽濡炶棄顕i妸鈺婃晬婵炲棙鍨电粭锟犳⒑閸濆嫬鈧骞婇幘鑸殿潟闁跨噦鎷�
闂備礁鎼崯鐗堟叏妞嬪海绀婂鑸靛姈閻擄綁鎮规潪鎷岊劅婵炲眰鍊曢湁闁挎繂妫欑粈鈧梺鍛娚戦悧鐘茬暦閹扮増鏅搁柨鐕傛嫹
婵犵妲呴崹顏堝礈濠靛棭鐔嗘俊顖氬悑鐎氱粯銇勯幘瀵哥畺閻庢熬鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓奸崶銊ヮ伕濡炪倖鎸荤换鍐偓姘虫珪娣囧﹪顢涘Δ鈧晶鍙夌節椤喗瀚�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洦鍓熼、娆撳礂閻撳簶鍋撻悽鍛婄厸闁割偅绻勫瓭婵犳鍣幏锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾闁哄苯鎳橀崺鈧い鎺嗗亾闁宠閰i獮鎴﹀箛闂堟稒顔嗛梻浣告惈鐎氭悂骞忛敓锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洩缍侀獮瀣攽閸偂绱�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勭厬闂佺懓鐡ㄧ换鍕敂鐎涙ü绻嗘い鏍殔婢у弶绻濋~顔藉
闂佽楠搁崢婊堝礈濠靛鍋嬮柟鎯版閻鈹戦悩鎻掓殭闁奸潧缍婇弻銈夋嚍閵夈儱顫嶉梺缁樼壄缂嶄礁鐣峰▎鎾存櫢闁跨噦鎷�
UB闂備礁婀辩划顖炲礉濡ゅ懐宓侀柛銉㈡櫆鐎氭岸鎮楀☉娅虫垿锝為敓锟�
闂備浇澹堟ご绋款潖婵犳碍鐒鹃悗鐢电《閸嬫捇鐛崹顔句痪濠电姭鍋撻柨鐕傛嫹
闂佽楠哥粻宥夊垂閸濆嫸鑰块柛銏㈠殰
闂備礁鎲″缁樻叏妞嬪海绀婂璺虹灱閸楁碍绻涢崱妤€顒㈤柛鐐差槹缁绘稓绱欓悩鍝勫帯闂佺ǹ楠忛幏锟�
缂傚倸鍊烽悞锕傛偡閿曞倸鍨傛繝濠傚椤╅攱銇勯幒宥囶槮缂佹彃婀遍埀顒傚仯閸婃繄绱撳棰濇晩闁跨噦鎷�
©2017 www.mb5u.com婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎殿噮鍣i幃鈺呭箵閹烘挸鐦�
闂備浇銆€閸嬫捇鏌熼婊冾暭妞ゃ儻鎷�&闂備礁鎲$敮鎺懳涢弮鍫燁棅闁跨噦鎷�