aspx文件:
aspx文件(新建项—>Web窗体)这个文件可以几乎写入任何的C#语句(就像当年的ASP),但是强烈不建议这么做。
这样的页面语法混杂,难以管理。
aspx中除了<%%>的内容和runat=server的内容,其他都是原样输出。
aspx中可以在<%%>中嵌入C#代码,如aspx.cs文件中的C#代码,都可以在<%%>中来写。但是不建议这么做。
在aspx中可以使用<%=表达式%>的方式在页面的当前位置输出表达式(表达式至少要用protected级别),
表达式可以是一个方法、属性、字段。不要忘了写=。
aspx目的像其他模板引擎一样,都是简化拼html字符串。
示例代码:
aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> <!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> <asp:CheckBox Text="显示问好" runat="server" Name="IsShow" ID="IsShow" AutoPostBack="True" OnCheckedChanged="Unnamed1_CheckedChanged" /> <% if (IsShowHelloWorld()) { // 这里就是C#代码,注释也是C#的注释语法 %> <br /> <%--这里是html代码,注释是这种语法 --%> <br /> <br /> <span style='color: red'> <%=GetHelloWorld() %> </span> <% } // 这里又是C#代码,与上面的if语句形成一个完整的判断。 %> </div> </form> </body> </html>
public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected bool isShowHelloWorld; protected bool IsShowHelloWorld() { return isShowHelloWorld; } protected string GetHelloWorld() { return "您好"; } protected void Unnamed1_CheckedChanged(object sender, EventArgs e) { if (IsShow.Checked) { isShowHelloWorld = true; } else isShowHelloWorld = false; } }
aspx、aspx.cs关系揭秘
在WebForm的页面中执行以下的代码:
protected void WriteType() { Response.Write(this.GetType() + "<br/>"); Response.Write(this.GetType().Assembly.Location + "<br/>"); Response.Write(this.GetType().BaseType + "<br/>"); Response.Write(this.GetType().BaseType.Assembly.Location + "<br/>"); }输出:
ASP.webform1_aspx
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\d6e1812d\9a75c48f\App_Web_d3gkj0nc.dll
WebApplication1.WebForm1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\d6e1812d\9a75c48f\assembly\dl3\3c414925\0ad1d900_4830cf01\WebApplication1.DLL
发现当前执行页面的类名是ASP.webform1_aspx这样的类名,
父类才是WebApplication6.WebForm1。
使用ILSpy或者Reflector等打开dll,反编译这两个类,发现
WebApplication6.WebForm1是在VS编译器中编写的aspx.cs类,
反编译的内容里没有任何前端页面上的html代码。
而ASP.webform1_aspx则是一个继承自WebApplication6.WebForm1的子类,
ASP.webform1_aspx代码是根据aspx内容动态生成的构建网页内容的类。
重写父类的方法,
protected override void FrameworkInitialize()
在FrameworkInitialize()方法里调用
private void __BuildControlTree(webform1_aspx __ctrl)
构建控件树。
在aspx中所有用C#写的代码都是在 _Renderform1方法里渲染拼接成html代码。
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer)
综上所述:
aspx最终也会生成一个类,
这个类是继承自aspx.cs中的类。
查看反编译以后的代码,可以看到就是编译生成了普通的.NET代码,
代码中在拼接html。因为aspx生成的代码是cs类的子类。
所以就明白了:
为什么“aspx中调用cs的成员级别必须是protected或者public,不能是private的。”
为什么“aspx中可以调用aspx.cs中的成员方法和属性了。”
摘自:传智播客 http://net.itcast.cn/