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>
aspx.cs:
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和ashx关系
aspx就是一个特殊的ashx,aspx对应的类是Page,Page是实现了IHttpHandler接口,
所以可以说aspx是高级的HttpHandler,aspx中帮我们封装了很多操作,我们可以傻瓜化的进行开发。
ashx(HttpHandler),aspx(Page)
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/