这次我们谈的话题是“Web Form页面上输出内容的方式”。这其实是一个非常旧的话题了,因为本文的内容甚至可以运用于ASP.NET 1.1之上。不过这个话题的适用范围很广,因为即使是目前最新的ASP.NET MVC框架,它的默认视图引擎依旧是基于ASP.NET WebForm的(如Page,Control,MasterPage)。甚至说,由于ASP.NET MVC框架的特性,我们会遇到更多在页面上“直接输出”内容的情况。因此,这个话题在ASP.NET MVC应用中可能由为重要。

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

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

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

public class MyPage : Page

{

protected override void Render(HtmlTextWriter writer)

{

...

}

}

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

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

在编译过后就成为:

writer.Write(DateTime.Now)

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

odd = i => i % 2 != 0; %>

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

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

for (int i = 0; i < 10; i++)

{

writer.Write("");

writer.Write(i + 1);

writer.Write("");

}

如果是写在页面上的普通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页面输出的细节。那么请问,以下两种输出方式的区别是什么呢?

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

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

asp.net webform html,ASP.NET WebForm页面内容输出方式相关推荐

  1. php获取页面输出内容,PHP CURL获取页面内容输出例子

    使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true. 1.curl ...

  2. 常见的几种页面内容布局方式

    在前端开发中页面布局总是最开始的工作,就像盖楼时,先搭框架,然后再填砖,前端也是一样的,先做好页面的布局工作. 通过浏览不同的网站发现,页面的布局都是大同小异,总结下来大概就几种: 第一种: 单列布局 ...

  3. linux 页面内容输出,Node.js 一个简单的页面输出

    最近决定重拾node.js,用它来做一个合并JS文件的东西.由于忘得差不多了,先看能不能输出一个页面来再说.以下是我的一些笔记,省得以后又忘净光-- 安装过程就不说了.如果成功是能使用node的命令. ...

  4. 怎么把一个控件放到tab页面上去?_移动端页面内容切换

    # 移动端页面内容切换 上周做了一个和页面切换相关的需求,为了探寻在需求场景下最符合用户心理模型的交互方式,当时一共输出了有四五种方案.总结一下各种切换页面内容的方式的特点和他们适用的场景.## 一. ...

  5. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较

    WebForm的理解 1. WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型(event-drivenGUI),隐藏了HTTP.HTML.JavaSc ...

  6. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...

  7. ASP.NET基础与入门:WebForm,事件驱动编程,Page类

    注:因为这个暑假做了一个ASP.NET的项目(WebForms模式),暑假期间太忙没有来得及整理,现在统一梳理下知识(有些我认为可以跟HTML共通的就没记) 推荐几个学习ASP.NET的网站: W3S ...

  8. WebForm常用的页面跳转方式

    ASP.Net中常用到的几种跳转方式:Response.Redirect().sever.execute.Response.Write() 1.Response.Redirect(" &qu ...

  9. Asp.net页面间传值方式汇总

    在优化.NET中,用到了页面传值的功能,汇总出来跟大家分享一下. 我找到了七种传值方式,分别是:URL传值,Session传值,Cookie传值,Server.Transfer传值,Applicati ...

最新文章

  1. [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
  2. Ruby中的多行注释?
  3. 第一部分:基础知识(第一章)屏幕部分续
  4. 主从多机matlab代码,Jenkins的Master Slave主从进行多机多环境部署-配置
  5. B 站硬件大佬在 GitHub 上开源了一款神器
  6. 嵌入式C语言基础(二)
  7. Vue+Axios同步请求
  8. linux设备文件生成,Linux设备文件自动生成(示例代码)
  9. 滑铁卢大学计算机科学双录取,滑铁卢大学双录取要求
  10. 线性模型第4讲:弹性网络
  11. 测量中的坐标与时间系统1.2(在大地测量学中)
  12. scrapy爬取阳光政务投诉
  13. CenterNet( Keypoint Triplets for Object Detection) 学习笔记
  14. python 因果推断_微软因果推理框架DoWhy入门
  15. 帆软公式如何用数据库字段_高考数学必背100招:如何用构造法求数列通项公式?...
  16. OllyDbg笔记-Olly Advanced插件使用
  17. 组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多变量时间序列预测对比
  18. HTML5之内联框架和音视频标签
  19. easy connect
  20. 实战之Discyz论坛项目测试环境搭建

热门文章

  1. Django 应用开发(2)
  2. LeetCode 375. Guess Number Higher or Lower II
  3. 关于添加“服务引用”和“添加引用”的一点总结
  4. centos让yum自动选择最快的源
  5. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...
  6. python中实例方法与实例属性-Python中的类属性和实例属性以及静态方法和类方法...
  7. python基础语法第10关作业-Python基础语法习题一
  8. 查看电脑python虚拟环境-Windows系统下,Python虚拟环境搭建
  9. python详细安装教程linux-在Linux上安装Python3
  10. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?