1.前台aspx代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Csharp前台代码.aspx.cs" Inherits="WebApplication1.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%Response.Write("Hello"); %>
<%for (int i = 0; i < 5; i++)
{%>
你好
<%} %>
<%=Name%>
<%=SayHello("dzj") %>
<%SayGoodBye(); %>
</div>
</form>
</body>
</html>
2.后台cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/*
cs与aspx的关系:
1.cs是父类,aspx是子类,前台(aspx)输出到客户端需要在cs动态编译创建的子类中(一般是以ASP.+aspx文件名形式)执行输出到客户端,可通过临时产生的dll反编译解释
*/
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
public string Name
{
get{
return "后台字段strName";
}
}
protected void SayGoodBye()
{
Response.Write(" Byebye");
}
public string SayHello(string name)
{
return name+" say Hello<b>";
}
protected void Page_Load(object sender, EventArgs e)
{
//注意此时this所引用的实际对象为aspx中的对象,而不是cs的Default对象(在后续查看dll可以看到)
Response.Write(this.GetType()+"<br/>");
Response.Write(this.GetType().Assembly.Location + "<br/>"); //获取aspx页生成的dll位置(在后续查看dll可以看到)
Response.Write(this.GetType().BaseType+"<br/>");
Response.Write(this.GetType().BaseType.Assembly.Location + "<br/>");//获取cs页生成的dll位置(在后续查看dll可以看到)
}
}
}
好了,现在编译运行一下,看到了如图
得到这两个dll的路径,通过使用Reflector工具加载这个两个dll文件得到如下图
之后展开查看
通过查看发现aspx页面动态生成了一个“csharp前台代码_aspx”的页面而且继承自Default类。好,接下来看一下Default类到底是谁。。点击Default跳转到如下图
现在可以知道,为什么在aspx页面中可以通过<%%>的形式调用cs中的代码了吧,其实就是aspx页面从cs页面中派生而来,子类调用父类的东西天经地义嘛。。。
其实还从其他方面可以发现
从aspx动态生成的对象可以看到,aspx执行输出也不过是调用基类(就是cs中Default对象的方法)然后类似Response.Write()的方式输出到页面而已
实质:PageHandlerFactory处理程序工厂使***.aspx在后台生成两个类:部分类*** 和 ***_aspx,其中后台cs代码文件中的部分类***将和PageHandlerFactory促使的部分类***合并生成为一个完整的***类定义,而 ***_aspx 则是从 MyPage 派生的一个页面类,用来创建实际的页面对象实例。引用例图:
可参考:《ASP.NET本质论》一书,非常不错
http://book.51cto.com/art/201102/245000.htm