前言
不知道这个东西能否算是技术文章或者是教程
这些是我在学习ASP.NET过程中的体会与心得,也许还有很多错误和需要改正的小毛病
但是,像这样站在学习者角度写的教程(姑且这么叫)或许会更容易让想要学习ASP.NET的人接受。
废话不多说直接开始
第一章 架构
第一节 基本原理与三个支柱
我是从学习ASP转而学习ASP.NET的,相信也不乏有许多像我这样的学习者,往往在开始会有许多不习惯,有人说不学习ASP对学习ASP.NET事件好事。但要真正熟练掌握ASP.NET,学习过ASP还是会有帮助的。
程序1
这是一个非常简单的显示动态内容ASP.NET网页,其中的处理请求的方式与ASP十分相似,使用了<%=%>在静态内容中插入动态内容
<%@ Page Language="C#" Debug="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
const int _itemCount = 10;
string GetDisplayItem(int n)
{
return "Item #" + n.ToString();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Simple page</title>
</head>
<body>
<h1>Test ASP.NET 2.0 Page</h1>
<ul>
<% for (int i=0; i<_itemCount; i++) { %>
<li><%=GetDisplayItem(i)%></li>
<% } %>
</ul>
<%
Response.Write("<h2>Total number of items = " + _itemCount.ToString() + "</h2>");
%>
<%= GetType().Assembly.Location %>
</body>
</html>
学习过ASP的朋友很容易理解其中的内容,通过<%=%>直接地将要显示的内容输出到HTML代码中,对于ASP.NET来说,这种方法的缺点就是代码与HTML代码互相掺杂,像这个例子,循环语句被HTML代码所分开,如果进行版面设计是非常不容易的事情,并且,设计者也无法直观的看到网页的样子,对一些格式的安排产生了影响,所以ASP.NET的诞生就很好的解决了这个问题,我们用到很重要的一个东西就是服务器控件,可以先看一下
程序2
<%@ Page Language="C#" Debug="true" Trace="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
const int _itemCount = 10;
string GetDisplayItem(int n)
{
return "Item #" + n.ToString();
}
protected override void OnLoad(EventArgs e)
{
// Clear out items populated by static declaration
_displayList.Items.Clear();
for (int i=0; i<_itemCount; i++)
_displayList.Items.Add(new ListItem(GetDisplayItem(i)));
_messageH2.InnerText = "Total number of items = " + _itemCount.ToString();
base.OnLoad(e);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Simple page with controls</title>
</head>
<body>
<form runat="server" id="_form" >
<h1>Test ASP.NET 2.0 Page with controls</h1>
<asp:BulletedList runat="server" ID="_displayList">
<asp:ListItem>Sample Item 1</asp:ListItem>
<asp:ListItem>Sample Item 2</asp:ListItem>
<asp:ListItem>Sample Item 3</asp:ListItem>
</asp:BulletedList>
<h2 runat="server" id="_messageH2">Total number of items = xx</h2>
</form>
</body>
</html>
大多数ASP.NET网页不使用脚本插入动态内容,而是使用服务器端控件架构。这些控件通常包含属性RUNAT="SERVER",并且以ASP字母开头,这些控件表示特殊的元素或者元素集合。如上述例子,项目列表和H2元素都是服务器端控件,在收到请求并且生成网页的时候,服务器将最开头的代码解释之后,替换服务器端控件的这些元素,最后还是以HTML代码呈现出来。这样的话,这些元素都是独立可编辑的,对他们的属性进行定义后便可以改变生成内容的属性,如字体,颜色,位置等等。使得在布局设计器中就能够正确的显示出运行阶段的基本外观,便于设计者进行布局排版。
这些控件后的ID属性就是与HTML代码之前的代码中相对应的对象,上述例子中的_messageH2、_displayList就是链接代码与布局的纽带。
服务器端控件就是我开头所说的第一个支柱
第二个支柱是类声明,这点对于初学者来说也许不好理解,我个人的理解(不一定正确),就是对原本的网页进行简化,去掉HTML代码,加上一些类声明的代码,然后使得整个网页成为一个类,可以像其他脚本一样交互,如程序一进行解析类声明后得到了
程序3
<%@ Page Language="C#" %>
<script runat="server">
const int _itemCount = 10;
string GetDisplayItem(int n)
{
return "Item #" + n.ToString();
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<!DOCTYPE html PUBLIC /"-//W3C//DTD " +
"XHTML 1.0 Transitional//EN/" /"http://www.w3" +
".org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
writer.Write("/r/n/r/n<html xmlns=/"http://www.w3.org/" +
"1999/xhtml/" >/r/n<head>/r/n<title>Simple page<" +
"/title>/r/n</head>/r/n<body>/r/n" +
"<h1>Test ASP.NET 2.0 Page</h1>/r/n " +
"<ul>/r/n ");
for (int i = 0; i < _itemCount; i++)
{
writer.Write("/r/n<li> ");
writer.Write(GetDisplayItem(i));
writer.Write("</li>/r/n ");
}
Response.Write("<h2>Total number of items = " +
_itemCount.ToString() + "</h2>");
writer.Write("/r/n</body>/r/n</html>/r/n");
base.Render(writer);
}
</script>
省略了HTML代码,加入了一些八股文之后就使得网页整个成为一个类,可以对其进行直接的引用。
第三个支柱是数据绑定,我们在进行网页制作的时候,并不需要对某些要显示的内容进行编程,比如上述例子中,ITEM1-ITEM10这些项目列表并不需要用编程的方式也能显示,比如直接的一个数组{ITEM1,ITEM2,ITEM3……},更有的时候,我们从数据库中直接读取数据,那么如何将这些数据显示到网页上呢?
程序4
<%@ Page Language="C#" Debug="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
string[] _displayItemData = {"Item #1", "Item #2", "Item #3", "Item #4", "Item #5",
"Item #6", "Item #7", "Item #8", "Item #9", "Item #10"};
protected override void OnLoad(EventArgs e)
{
_messageH2.InnerText = "Total number of items = " + _displayItemData.Length.ToString();
_displayItems.DataSource = _displayItemData;
_displayItems.DataBind();
base.OnLoad(e);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Simple page with controls</title>
</head>
<body>
<form runat="server" id="_form">
<h1>Test ASP.NET 2.0 Page with data binding</h1>
<asp:BulletedList runat="server" ID="_displayItems">
<asp:ListItem>Sample item 1</asp:ListItem>
<asp:ListItem>Sample item 2 ...</asp:ListItem>
</asp:BulletedList>
<h2 runat="server" id="_messageH2">Total number of items = xx</h2>
</form>
</body>
</html>
例子中使用了服务器端控件BULLETELIST,将枚举型的数据元素集合(数组string[] _displayItemData )绑定到了这个控件上,通过 _displayItems.DataSource = _displayItemData;与 _displayItems.DataBind();两个声明实现数据源的获取,而ID="_displayItems"则是链接代码与内容的纽带。
到现在位置,本节的内容已经结束,通过学习我了解了如何将网页解析为类声明、服务器端控件和通用的数据绑定,ASP.NET2.0就是建立在这些支柱的基础之上的。而开发人员可以高效的使用一些工具,使得网页开发效率大大提高。
-------------------------------------------------------------------分割线----------------------------------------------------------------
写后感:
第一次写技术文章心里总是有些忐忑不安,生怕写错内容或者写的不好,当然这些东西是不可避免的,作为一个学习者。
从使用记事本写ASP到用VS开发ASP.NET,计划永远是赶不上变化的,这不,AJAX技术又向我们袭来,我们只能稳住不乏,在过程中磨练。
这个系列的学习心得我会继续写下去,我学多少写多少,当然最希望大家对我的文章提出一些建议,有错误的地方希望能指正,我会认证接受修改,以免误人子弟。
其他初学者可以借鉴一下我的理解,当然重要的还是自己去参透,毕竟我也只是初学者。