WebForm 基础1

来源:互联网 发布:2017好看的网络自制剧 编辑:程序博客网 时间:2024/04/28 21:54

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内容动态生成的构建网页内容的类。

重写父类的方法,

protectedoverride 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/

0 0