asp.net的页面代码组织模式
Asp.net 的页面代码组织模式
2005-09-15
从asp.net的页面代码组织的模式,可以窥得web页面代码组织模式的发展。
1、Code Inline:内含代码,即代码直接书写在aspx页面中,和html代码混排在一起。
script1: 代码包含在<script runat="server"></script>块内
2
3 <script runat="server">
4
5 void Button1_Click(object sender, EventArgs e)
6 {
7 Label1.Text = "Hello " + TextBox1.Text;
8 }
9 </script>
10
11 <html>
12 <head>
13 <title>WebForm1</title>
14 </head>
15 <body>
16 <form id="Form1" runat="server">
17 <h1>Welcome to ASP.NET 2.0!</h1>
18 <b>Enter Your Name:</b>
19 <asp:TextBox ID="TextBox1" Runat="server"/>
20 <asp:Button ID="Button1" Text="Click Me" OnClick="Button1_Click" Runat="server"/>
21 <br />
22 <br />
23 <asp:Label ID="Label1" Text="Hello" Runat="server" />
24 </form>
25 </body>
26 </html>
虽然现在都提倡设计和逻辑分离,即html和cs代码分离,但在早期的web开发中,内含代码是唯一的方法,也带来了难以维护和代码可读性差的问题。
2、Code Behind:asp.net 1.x中采用的页面代码组织模式
上面的图来自msdn,从这张图可以看出来aspx继承自对应的CodeBehind类(明白每个aspx页面一开始就有Inherits的原因了把),在编译时,CodeBhind类编译到webui工程对应的dll中,而aspx页面中的内含代码和aspx一起编译到temporary.dll中,被客户端浏览器访问。
同时,不同的aspx页面可以继承自同一个CodeBehind类(修改Inherits即可),对于逻辑操作相同的页面不需要重复编码。但是,这样的代码组织模式也带来了一个问题:aspx与CodeBehind类的Server Control相关代码的同步问题。看看你有没有碰到一下的情况:
1、在aspx页面里面添加了一个控件,但是在CodeBehind类中并没有自动添加相应控件的数据成员;
2、原来添加的控件事件莫名奇妙丢失;
3、在aspx页面里删掉了某个控件,但是在CodeBehind类的InitializeComponent函数(一般由ide生成)中,还是保留相关的管线代码;
特别说明一下,对于第一个问题,只需要在CodeBehind代码中手工添加变量名为aspx中控件的id属性的,protected(public理论上也可以,but, 没试过)的控件数据成员即可。
为什么会出现这样的问题呢?为了实现asp.net 1.x的CodeBehind,在CodeBehind中实现对所添加的Server Control的访问,就必须在CodeBehind类中添加相应的控件成员,同时,对于控件的Event的设定。当在aspx中删除了该server control以后,CodeBehind中的相应控件成员和event设定的代码就成了无用代码,通常ide可以自动删除对应的控件成员,但是对管线代码就无能为力了。
3、Code Beside:基于不完全(partial)类的概念,原来的CodeBehind类摇身一变成了partial类,到底CodeBeside有什么优点呢?
首先,解决了CodeBehind模式中aspx和CodeBehind类间的ServerControl管线代码的同步问题。所有的管线代码在aspx 中编写,CodeBeside类作为aspx的partial类,可以自由访问aspx中的server control,不用在codebeside类中添加server control成员的定义。
其次,codebeside类较codebeside类更易于重用。
p.s.:如果不从重用的角度考虑,个人认为直接把CodeBeside代码作为script block写在aspx页面也一样,wait,这样不是回到code inline了吗?
All the posts in this blog are provided "AS IS" with no warranties, and confer no rights. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 2.5 China Mainland License.