1. AutoPostback属性
如果希望把Changed事件立即传送给服务器(例如,改变了DropDownList的选项),可以把AutoPostBack属性设置为true。
________________
2. Page类的PreviousPage属性
利用PreviousPage从前一个页面定义的控件中获取值,有以下两种方法:
·i 利用FindControl()
例:
在新页面中写入如下代码
string firstName = ((TextBox)PreviousPage.FindControl("txtFistName")).Text; // txtFistName是前一个页面中控件的ID。TextBox将找到的控件转换成TextBox类型。
·ii 定制结构,创建强类型化PreviousPage
例:
首先,在App_Code中创建一个 新的 C#文件。假设命名为 RegInfo.cs,并在其中创建一个结构,如下:
public struct RegInfo
{
public string FirstName {get; set;}
public string LastName {get; set;}
......
}
在第一个页面中添加公共属性 RegInfomation
public RegInfo RegInfomation
{
get
{
return new RegInfo()
{
FirstName = txtFirstName.Text;
LastName = txtLastName.Text;
.....
}
}
}
在第二个页面的Page指令下添加 PreviousPageType指令
«% Page Language="C#" AutoEventWireup="true" CodeFile="SecondPage.aspx.cs" Inherits="SecondPage_aspx" %»
«% PreviousPageType VirtualPath="~/Default.aspx" %»
然后,就可以在第二个页面中使用如下代码,调用第一个页面的数据,如下:
RegInfo ri = PreviousPage.RegInfomation; // 将第一个页面的 公共属性 赋值 给 ri
label1.Text = ri.FirstName; // 用ri.FirstName来获取第一个页面的txtFirstName.Text 的值
.......
________________
3. PreviousPage.IsValid 验证
当第一个页面中 包含输入有效性验证控件,而回送的页面不同于 包含验证的第一个页面时,在页面中需要用到IsValid属性,验证上一个页面的结果是否有效。如下:
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!PreviousPage.IsValid)
{
labelResult.Text = "Error in previous page";
return;
}
.........
} ......
}
********************************
验证控件创建了客户端的JavaScript代码。
可在验证控件的EnableClientScript属性设置是否使用JavaScript验证,设置为false就可以关闭JavaScript。
也可以用Page类的ClientTarget属性:
ClientTarget = downlevel 脚本代码不返回给客户端
ClientTarget = uplevel 脚本代码返回给客户端
ClientTarget = automatic 根据浏览器的功能,自动选择是否返回脚本代码
________________
4. 状态管理(ViewState、Cookie、Session、Application、Cache)
状态类型 客户端 或 服务器 资源 有效时间
ViewState 客户端 只在一个页面中
Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上
Session 服务器 会话状态与浏览器会话相关。会话在超时后无效(默认为20分钟)
Application 服务器 应用程序状态在所有的客户端上共享,这个状态在服务器重启之前都是有效的
Cache 服务器 类似于应用程序状态,高速缓存是共享的。但是,是高速缓存无效有更好的控制方式
ViewState:
ViewState包含的状态与控件发送给客户端时 包含的状态相同。
当浏览器把 窗体发送 回服务器时, 控件包含新值,而 ViewState包含初始值。如果ViewState中的初始值 与 控件中的新值有区别时,调用相应的事件处理程序。
使用ViewState的缺点是,数据总是要从服务器 -» 客户端,再 客户端 -» 服务器。增加了网络流量。
关闭ViewState的方法:
«% Page Language="C#" AutoEventWireUp="true" CodeFile="Default.aspx.cs" Inherts="Default_aspx" EnableViewState="false" %»
还可以设置 控件的 EnableViewState属性。只有没有配置ViewState的控件才使用页面配置的值。
还可以把定制的数据存储在ViewState中。为此,可使用索引符 和 Page类的ViewState属性。
ViewState["mydata"] = "my data"; //将字符串存储在 ViewState中
读取:
string mydata = (string)ViewState["mydata"]; //将前面存储的值读取出来。
在发送客户端的HTML代码中,整个页面的ViewState存储在一个隐藏字段中:
«input type="hidden" name="_VIEWSTATE" value="/wEPDwUKLTU........................."/»
使用隐藏字段的优点是,每个浏览器都能使用这个特征,用户不能关闭它。
Cookie:
ViewState只能保存在页面中。如果状态应保存在多个不同的页面中,就应使用cookie在客户端保存状态。
cookie在HTTP头中定义。
使用HttpRespone类可以把cookie发给客户端。
Response是Page类的一个属性,它返回一个HttpResponse类型的对象。
HttpResponse类定义了返回HttpCookieCollection的Cookie属性。
使用HttpCookieCollection可以向客户端返回多个cookie。
如何把cookie发给客户端:
string myval = "myval";
HttpCookie cookie = new HttpCookie("mycookie"); //首先实例化一个HttpCookie对象,并设置cookie的名称为“mycookie”
cookie.Values.Add("mystate",myval); // 用HttpCookie类的Value属性可以添加多个cookie值
Response.Cookie.Add(cookie); // 发送cookie
设置cookie有效期:
cookie可以是临时的,仅在一个浏览器会话中有效,也可以是存储在客户端磁盘上。
可以使用HttpCookie对象设置的Expires属性。
HttpCookie cookie = new HttpCookie("mycookie");
cookie.Values.Add("mystate","myval");
cookie.Expires = DateTime.Now.AddMonths(3); // 设置cookie有效期为3个月
Response.Cookies.Add(cookie);
尽管设置了cookie,但不一定能存储那么长时间。
用户可能会删除cookie;
如果本地有太多的cookie,浏览器也可能删除它。
浏览器只能为每个服务器存储 20 个cookie;为所有服务器 存储 300个cookie;cookie大小有限制,cookie不能存储多于4K的数据。达到极限后,就删除有一段时间不用的cookie。
读取客户端发送的cookie:
客户从服务器请求页面时,相应的cookie就可以使用了。
并作为HTTP请求的一部分发送给服务器。
要读取cookie,可以访问HttpRequest对象的cookie集合。
与HTTP响应一样,Page类也有一个Request属性 返回 HttpRequest类型的对象。
Cookies属性返回HttpCookieCollection,它可以读取客户端发送的cookie。
可以用索引符来访问cookie,并使用HttpCookie的value属性从cookie中获取值。
HttpCookie cookie = Request.Cookies["mycookie"];
string myval = cookie.Values["mystate"];
Session:
会话状态 与 浏览器会话相关。 当客户第一次打开ASP.NET页面时,会话就开始了。当客户20分钟(session默认值)内没有访问服务器时,会话结束。
可以在Global Application类中定义自己的代码,在会话开始或结束时运行。新的Global Application类会创建global.asax文件。文件中定义了一些事件处理程序:
«% Application Language="C#" %»
«script runat="server"»
void Application_Start(object sender, EventArgs e) {......}
void Application_End(object sender, EventArgs e) {......}
.......
«/script»
会话状态可以存储在HttpSessionState对象中。
与当前HTTP环境相关的会话状态对象可以使用Page类的Session属性来访问。
设置会话状态:
void Session_Start(Object sender, EventArgs e) { Session["mydata"] = 0; } // 在Session_Start()事件处理程序中,初始化会话变量,mydata会话被初始化为 0
读取会话状态:
int val = (int)Session["mydata"];
要把客户端 与 会话变量 关联起来, ASP.NET默认使用一个临时cookie 和 一个会话标识符。
ASP.NET也支持没有cookie的会话,其中URL标示符 用于把 HTTP请求映射到同一个会话。
Application:
如果数据要在多个客户端共享,就可以使用应用程序状态(Application)。比如,网站访问计数器。
应用程序状态使用HttpApplicationState类,通过Page类的Application属性访问。
以网站访问计数器为例:
设置状态:
void Application_start(object sender, EventArgs e) { Application["userCount"] = 0 ; } // Application_Start()是global.asax文件中的事件处理方法,在启动网站的第一个页面时启动。
改变状态:
void Session_Start(Object sender, EventArgs e)
{
Application.Lock(); // 应用程序状态改变之前,必须要用Lock()锁定,因为多个用户可以同时访问这个应用程序变量。
Application["userCount"] = (int) Application["userCount"] +1;
Application.UnLock(); // 锁定 与 解锁之间的时间应尽量短,否则,其他人就得等解锁之后才能操作。
}
读取状态:
label1.Text = Application["userCount"].ToString();
Cache:
类似于Application,可以在多个客户端上共享。但Cache可以自定义何时失效。我们不是给每个请求读取文件或数据库,而是把数据存储在高速缓存(Cache)中。
Cache使用System.Web.Caching名称空间 和 Cache类。
给Cache添加对象:
Cache.Add("mycache", myobj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null );
Page类的Cache属性返回一个Cache对象。使用Cache类的Add()方法可以把任意对象赋予高速缓存。
第一个参数,定义Cache项的名称;
第二个参数,是要被缓存的对象;
第三个参数,定义了依赖关系。比如,Cache依赖于一个文件,当文件改变时,高速缓存对象就失效,本例中没有依赖关系;
第四个参数,定义了Cache失效的绝对时间;
第五个参数,定义了Cache失效的相对时间;
第六个参数,定义了Cache的优先级,当需要删除Cache时,会根据优先级删除。优先级低的先删除。
最后一个参数,定义了一个方法,当删除Cache调用。当Cache依赖于一个文件时,就可以用该参数:文件改变时,删除Cache,调用方法,再次读取文件,重新建立Cache。
读取Cache:
object o = Cache["mycache"];
if(o == null)
{ //reload the cache }
else
{ //use the cache
MyClass myObj = (MyClass)o;
}
使用Cache属性返回的对象之前,必须检查结果是否为null,当高速缓存失效时,结果就是null。
________________
5. 母版页
母版页的扩展名是.master。
母版前台的第一行指令:
«% MasterLanguage="C#" AutorEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %» //AutorEventWireup="true" 意思是会调用Page类的6个事件
//Page类的六个事件:InitComplete,LoadComplete,PreLoad,PreRenderComplete,SaveStateComplete
在web站点中,只有母版页才使用«html»,«head»,«body»和«form»等HTML元素。
web页面本身只包含内嵌到«form»元素中的内容,嵌入到母版中的ContentPlaceHolder控件中。母版也可以为ContentPlaceHolder定义默认内容。
母版前台代码:
«html xmlns="http://www.w3.org/1999/xhtml"»
«head runat="server"»
«title» *****«/title»
«asp:contentplaceholder id="head" runat="server"»
«/asp:contentplaceholder»
«/head»
«body»
«form id="form1" runat="server"»
«div»
«asp:contentplaceholder id="ContentPlaceHolder1" runat="server"»
«/asp:contentplaceholder»
«/div»
«/form»
«/body»
«/html»
使用母版页:
在Page指令中使用MasterPageFile指令:
«%Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="ture" CodeFile="Default.aspx" Inherits="default" Title="Untitled Page" %» //指定母版页
«asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="server" » «/asp:Content»
«asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="server" » «/asp:Content» //用Content控件把ContentPlaceHolder用ContentPlaceHolderID联系起来
在web.config文件中配置:
«configuration»
«system.web»
«pages masterPageFile="~/MasterPage.master"/»
«!--....--»
«/pages»
«/system.web»
«/configuration»
然后,在web页面中进行Content元素配置。
如果,同时使用Page指令的masterPageFile属性 与 web.config中的配置,Page指令会覆盖web.config的设置。
编程修改模板页:
比如,可以把不同的母版页用于不同的设备 或 不同的浏览器。Page_PreInit(Page类的6个事件之一)是修改母版的最后一个地方。
下面依客户端浏览器设置母版页:
public partial class changeMaster: System.Web.UI.Page
{
void Page_Load(object sender, EventArgs e) {.......}
void Page_PreInit(object sender, EventArgs e)
{
if (Request.UserAgent.Contains("MSIE")) //如果浏览器发送MSIE字符串 和 浏览器名称(由IE发送)
{
this.MasterPageFile = "~/IE.master"; //就将母版设置为IE.master
}
else
{
this.MasterPageFile = "~/Default.master";
}
}
}
________________
6. CSS代码
定义:
«head runat="server"»
«title»*****«/title»
«style type="text/css"»
.style1
{
width: 100% ;
height:353% ;
}
.style2
{
text-align: center ;
font-size:smaller ;
}
«/style»
«/head»
使用:
«table class="style1"»
«td style="style2"»
________________
7. 站点导航
导航控件:SiteMapDataSource, Menu, SiteMapPath, TreeView
站点结构由Web.sitemap定义。
SiteMapDataSource是数据源控件,可以使用不同的提供程序。
默认是使用XmlSiteMapProvider类来获取数据。
XmlSiteMapProvider类默认使用Web.sitemap页面。
如果重命名了Web.sitemap这个XML文件,就需要在提供程序的siteMapFile属性重新设置文件名。
________________
8. 用户控件 .ascx
Control指令:
在源文件的第一行中使用control指令表示用户控件。CodeFile 和 Inherits属性的用法与Page指令相同。
«%@ Control Language="C#" AutoEventWireup="true" CodeFile="DemoUserControl.ascx.cs" Inherits="DemoUserControl" %»
在用户控件中不是用«html»和«form»标记
静态添加到页面:
使用Register指令来引用用户控件:
«%@ Page Language="C#" AuotEventWireup="true" CodeFile="DemoPage.aspx.cs" Inherits="DemoPage" %»
«%@ Register TagPrefix="ucl" TagName="DemoUserControl" Src="DemoUserControl.ascx" %»
«html xmlns="http://www.w3.org/1999/xhtml"»
...
«ucl:DemoUserControl ID="DemoControlA" runat="server"» //«ucl:DemoUserControl»是根据Register指令中的设置的来的
...
动态加载:
void Page_Load(object sender, EventArgs e)
{
Control c1 = LoadControl("DemoUserControl.ascx");
PlaceHolder1.Controls.Add(c1); //PlaceHolder1是一个PlaceHolder控件
}
________________
9. 个性化配置
为了永远记住用户信息:可以使用个性化配置(profile)。
个性化配置特性:
·i 永久存储的。
数据由”个性化配置提供程序“ 管理。
ASP.NET 3.5 包含了SQL 和 Access的提供程序。 但也可也自己开发提供程序。
·ii 强类型化的
会话 和 应用程序变量 必须转换类型后才能访问数据。
使用个性化配置文件,会生成带有个性化配置名的属性。 该属性的名称 和 类型 在 配置文件中定义。
·iii 可用于匿名 和 授权 用户
匿名用户的凭证可以存在cookie中。
创建个性化配置:
在web.config文件中添加«profile»XML元素部分
«configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"»
«system.web»
.....
«profile»
«properties»
«add name="Country" /» //Country属性的默认类型为string
«add name="Visits" type="System.Int32" defaultValue="0" /»
«add name="LastVisit" type="System.DateTime" /»
«/properties»
«/profile»
.....
«/system.web»
«/configuration»
写入配置:
protected void OnCountrySelection(object sender, EventArgs e)
{
Profile.Country = this.DropDownListCountries.SelectedItem.Value;
Profile.Save( );
}
显示配置文件中的当前值:
void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{ DropDwonListCountries.SelectedValue.Value = Profile.Country;}
labelLastVisit.Text = Profile.LastVisit.ToLongTimeString();
labelVisitCount.Text = Profile.Visits.ToString( );
labelCountry.Text = Profile.Country; // Profile的属性是强类型化的
Profile.Visits++;
Profile.LastVisit = DateTime.Now;
}
Page类中没有Profile这个属性,该属性也不是在web.config中配置的,是动态创建的。
Profile属性的类型是一个动态创建类,派生于ProfileBase,包含配置文件的定义。
个性化配置组(«group»元素):
«profile»
«properties»
«add name="Country" /»
«add name="Visits" type="System.Int32" defaultValue="0" /»
«group name="ProfileGroup1" »
«add name="Country" /»
«add name="City" /»
«/group»
«/properties»
«/profile»
访问组中定义的配置值:
string country = Profile.ProfileGroup1.Country;
组件的个性化配置:
组件代码中,不能用Profile属性,要用HttpContext来访问。
Current是HttpContext类的一个静态属性,它返回一个HttpContext对象。
Profile属性返回一个ProfileBase类的对象,每个配置值可以用索引符来访问。
索引符定义 返回 Object对象,所以,需要类型转换。
string country = (string) HttpContext.Current.Profile["Country"];
定制数据类型中的个性化配置:
个性化配置 还可以 储存 定制数据类型,但这些数据需要支持序列化机制。
个性配置支持的序列化机制:
XML序列化::XML序列化是默认的;
二进制序列化:在二进制序列化中,类必须用[Serializable]属性标记;
字符串序列化:在字符串序列化中,可以使用类型转换类来序列化;
用serializeAs属性定义序列化方式,属性值有:Binary, Xml 和 String。
如果没有设置该属性,就是用XML序列化。
«profile»
«properties»
«add name="Demo" type="MyClass" serializeAs="Binary" /»
«/properties»
«/profile»
匿名用户的个性化配置:
必须在配置文件中启用匿名用户,并逐个设置能用于匿名用户的每个个性化配置属性。
«configuration»
«system.web»
«anonymousIdentification enabled="true" /»
«profile»
«properties»
«add name="Country" allowAnonymous="ture"»
«/properties»
«/profile»
配置匿名用户后,就会在 “个性化配置提供程序的数据库” 中创建匿名用户。
匿名用户会获得ID,ID默认存储在cookie中。也可以用URL中的标识符来替代cookie。
匿名配置信息 转移到 授权用户中:
例如,在购物网站中,将商品加到购物车中,当发送订单时,就必须登录系统。将购物车的信息迁移到授权用户上。
为处理匿名用户信息,可以利用global.asax中的以下事件:
AnonymousIdentification_Create :当匿名用户第一次访问站点时,会创建匿名个性化配置。此时,会调用这个事件;
AnonymousIdentification_Remove :授权用户访问站点,且授权用户请求中包含一个匿名用户的配置信息时,会删除匿名用户配置信息。并会调用这个事件;
Profile_MigrateAnonymous : 调用完 AnonymousIdentification_Remove 后,会调用这个事件。利用该事件处理程序会把你们pe
void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)
{
if (Profile.Country == null) //登录后,Profile.Country 中存储的是授权用户的值。所以,先检测一下是否有值。
{
Profile.Ccountry = Profile.GetProfile(e.AnonymousId).Country; //通过GetProfile(匿名用户ID)方法,读取匿名用户的配置。
}
}
________________
10. Web Parts
Web Parts框架有 区域(Zone)和 部分(Part)组成。Part 包含在 Zone中。
共有四个区域(Zone):
Web Parts Zone:这是主区域。一个页面可以有多个Web Part Zone来定义布局。区域中可以包含多个web part,用户控件 或 web服务器控件;
Catalog Zone:该区域允许用户从目录中选取要显示的web part。
Editor Zone:用户可以编辑Web Part的行为和外观。允许修改的web part有:AppearanceEditorPart, BehaviorEditorPart 和 LayoutEditPart。
Connections Zone: 用于把多个web part连接在一起,实现web part之间的通信。
0)WebPartManager控件:
每个Web Parts站点都需要一个WebPartManager控件。通过它,可以管理 创建、删除或移动web parts。
使用的方法:
将下面的ASPX代码加到Web页面上
«asp:WebPartManagerID=“WebPartManager1” runat=“server”» «/asp:WebPartManager»
这个控件在运行期间,没有用户界面,也不需要配置任何属性。它的属性只能用于删除和关闭web part时配置一些警告信息。
WebPartManager的方法可用于改变显示模式。
1)WebPartZone控件:
要使用Web Parts框架,至少要有一个WebPartZone。
在ASPX页面中代码:
«asp:WebPartZone ID="EventsZone" runat="server" »
«ZoneTemplate»
«ucl:ListEvents ID="ListEvents1" runat="server"/» // 包含了一个用户自定义的控件
«/ZoneTemplate»
«/asp:WebPartZone»
WebPartZone中可以定义布局,颜色和菜单。 示例见书P546。
«asp:WebPartZone BorderColor="#CCCCCC" Font-Names="Verdana"..........
2)EditorZone控件:
AppearanceEditorPart, BehaviorEditorPart 和 LayoutEditPart三个控件如下图。
3)CatalogZone控件:
CatalogZone控件是一个真正的目录-可以从目录中选取web part。
ASP.NET有三种目录: PageCatalogPart, DeclarativeCatalogPart, ImportCatalogPart。
PageCatalogPart:列出了web页面中所有的web part;
DeclarativeCatalogPart: 列出在«WebPartsTemplate»中显示定义的web part;
«asp:CatalogZone ID="CatalogZone1" runat="server"»
«ZoneTemplate»
«asp:DeclarativeCatalogPartrunat="server" ID="DeclarativeCatalogPart1" »
«WebPartsTemplate»
«ucl:ListEvents ID="ListEvents2" runat="server" /»
«asp:Calendar ID="Calendar1" runat="server" /»
«/WebPartsTemplate»
«/ZoneTemplate»
«/asp:CatalogZone»
ImportCatalogPart:用于将 存储在客户系统 中的Web Part 导入 到服务器上。
4)ConnectionsZone控件:
WebPartManager负责 初始化 和 管理Web Parts之间的通信。 web part通信分为:Provider 和 Consumer。
Provider用属性[ConnectionProvider] & Consumer用属性[connectionConsumer]来标识。
例:
Provider 部分:
在App_Code中创建一个文件,建立一个接口
public interface ICountry
{
string GetCountry();
}
在控件代码中:
public partial class ListEvents: System.Web.UI.UserControl, ICountry
{
......
public string GetCountry()
{ return DropDownListCountries.SelectedItem.Value; }
[ConnectionProvider("Country", "CountryProvider")]
public ICountry GetCountryInterface()
{ return this;}
.......
}
Consumer部分:
[ConnectionProvider("Country", "CountryProvider")]
public ICountry SetCountry(ICountry provider)
{
string country = provider.GetCountry();
if (!string.IsNullOrEmpty(country)) { LabelCountry.Text = country; }
}
接下来有两种方法建立连接:
a) 使用WebPartManager建立静态链接:
«asp:WebPartManager ID="WebPartManager" runat="server" »
«StaticConnection»
«asp:Connection ID="CountryConnection" ProviderID="ListEvents1" ProviderConnectionPointID="CountryProvider"
ConsumerID="Country1" ConsumerConnectionPointID="CountryConsumer" /»
«/StaticConnection»
«/asp:WebPartManager»
b) 启用ConnectionsZone,使用户控制连接和断开连接:
删除WebPartManager上的静态连接;
添加ConnectionsZone控件;
把WebPartMananager设置为ConnectDisplayMode;
在Provider或Consumer控件上会提供Connect菜单,点击后会打开ConnectionsZone,然后进行设置。
________________
11. JavaScript
ECMAScript是这个脚本语言的标准化版本。
Script元素:
在HTML代码中添加JavaScript代码
«script language="javascript" type="text/javascript"»
«!--
function foo()
{ ..... }
--»
«/script»
也可以把脚本代码放在一个单独的.js文件中, 然后,在script块中用src属性引用这个单独的文件:
«script language="javascript" type="text/javascript" src="SampleScripts.js" /»
变量的声明:
变量用var关键字声明(但这个var与C#3.0中的完全不同)。
JavaScript不是强类型化语言,var声明的变量可以是任何类型,比如:
var x=3;
x="text";
x=new Object();
x.FistName = "Tom";
变量时动态创建 和 赋值的。
也可以在一行代码上声明和初始化对象:
var p = {"FirstName":"Tom", "LastName": Turbo };
访问属性值:
var f = p.FirstName;
var l = p["LastName"];
定义函数:
函数用function关键字定义
function foo(arg1, arg2)
{ ...... }
也可以用Function对象来定义引用函数的变量。
var add = new Function("x","y","return x + y"); //最后一个参数定义了函数的执行方式,之前的参数列出函数的变元。
语句:
JavaScript可以使用 :for,while,do...while,if...else,switch,for...in(代替foreach)
for...in不仅可以迭代数组,还可以迭代对象的所有属性,如下所示:
var p = {"FirstName":"Tom", "LastName": Turbo, "Country":"Austria"}; //三个属性
var s = "";
for (key in p)
{
s += key; //key 为 p对象的属性
s += ":"
s += p[key];
s += "/t";
}
预定义对象 和 方法:
JavaScript提供了一些预定义对象 和 几个方法。
string对象:
用于处理字符串。
方法有 toUpperCase()、toLowerCase()、indexOf()、LastIndexOf() 和 slice().
IndexOf( )返回字符串中第一个子字符串;LastIndexOf()返回组合一个子字符串;slice根据指定的开始和结束为止返回一个子字符串。
Math对象:
可以进行一些计算。
方法有abs(),sin(),cos(),tan(),random()和round。
Date对象:
表示时间和日期。
方法getYear(),getMonth(),getDay(),getHours(),getMinutes()
*********************************************************************************************************
JavaScript例:
创建对象:
«script type="text/javascript"»
function Person(firstName, lastName) //用this关键字创建属性
{
this.firstName = firstName;
this.lastName = lastName;
}
function toString()
{
return this.firstName + " " + this.lastName;
}
Person.prototype.constructor = Person; //指定构造函数
Person.prototype.toString = toString; //指定类的成员函数
//以上代码创建了一个Person类
//应用Person对象的方法
function getPerson()
{
var p = new Person ( "Natalie","Portman" );
var label = document.getElementById("div1"); //在页面查找标记div1
label.innerHTML = p.toString();
}
«/script»
打开窗口:
«script type="text/javascript"»
function openWindow()
{ window.open("ObjectDemo.aspx"); }
«/script»
添加HTML的Button控件,调用 上面的函数:
«input id="Button1" type="button" value="button" onclick="openWindow();"/»
open方法的参数:
window.open("ObjectDemo.aspx", "_blank", "menubar=no, resizable=no, status=no, titlebar=no, width=300, height=300");
第一个参数:应打开的文档;
第二个参数:定义窗口的名称;
第三个参数:是一个逗号分隔的特性列表。可以指定窗口的大小,是否显示几个选项。如菜单、标题和状态栏。
________________
****************************************Web 服务*****************************************************
12. SOAP
简单对象访问协议,Simple Object Access Protocol。
最初SOAP定义使用HTTP协议,所以SOAP调用可以通过Internet实现。
SOAP1.2中,Web服务独立于HTTP协议,可以使用任意传输协议。但醉成用的协议仍是HTTP。(www.w3.org/tr/soap/ 可以获得规范)
________________
13. XML数据工具
.net framework XML类提供了一些方法用来得到需要的数据。
可用来得到web服务以XML显示的信息。如果用C#,有工具直接生成执行任务的代码。
________________
14. Web服务的体系结构
WSDL文档:
Web服务描述语言,Web Service Description Language.
WSDL包含的信息:服务支持的方法,如何调用方法,给服务传送的参数类型,从服务返回的参数类型。
WSDL文档用于:创建带有相同方法 和 参数的 客户代理程序。
规范:www.w3.org/tr/wsdl
获得WSDL的方法:
在.asmx后面加上?wsdl, 比如:http://localhost:1234/service1.asmx?wsdl
所有ASP.NET Web服务都用.asmx扩展名来标识(就像.aspx)。
生成WSDL:
WSDL文档是用[WebMethod]属性自动生成的;
[WebMethod]属性标记:
例:
下面的是一段.NET Web服务程序
using System.Web;
using System.Web.Services;
.....
pulbic class Service:System.Web.Services.WebService
{
[WebMethod]
pulic string HelloWord()
{
return "Hello World";
}
}
服务中可以使用的方法都必须用[WebMethod]来标记。没有这个标记的方法可以从WebMethod中调用,但不能在客户机上调用。
服务的调用方法:
要调用web服务上的方法,该调用 要先转换为 SOAP信息,SOAP信息是在WSDL文档中定义的。
SOAP是客户机 和 服务器之间通信的 基本单元。
SOAP可以由代理程序创建
P567有详细的“HTTP POST请求” SOAP 消息 的 范例。
WS-I基本个性化配置:
SOAP存在有段日子了,有时很难其他销售商的web服务交互。所以,建立了WS-I组织。
WS-I定义了Web服务需求。
Web服务交互操作组织(Web Service Interoperability Organization) http://ws-i.org
WS-I规范:www.ws-i.org/profile/basicprofile-1.1.html
________________
15. Web服务 和 .NET FRAMEWORK
.net framework中用于处理web服务的namespace:
a)System.Web.Services 用于创建web服务
b)System.Web.Services.Description 可以通过WSDL描述 Web服务
c)System.Web.Services.Protocols 可以创建SOAP请求和响应
web服务程序:
创建一个ASP.NET Web Service Application的project。起个名,比如WebServiceSample。
项目模板生成的文件:Service1.asmx & Service1.asmx.cs
在文件中写入代码,服务方法要用[WebMethod]标识
要为服务生成的描述信息 加一个唯一的标识--加一个命名空间。在Service1.asmx.cs文件中:
[WebService(Namespace="http://www.areslab.com/WebService")] //可以用公司的网址做标示符(可以确保其他公司不会用),链接不是一定要存在。
[WebServiceBinding.......
......
客户代理程序:
客户机必须创建一个与 web服务所在的服务器之间的连接。
并发送一个HTTP请求,传送一个SOAP消息(方法调用必须转换为SOAP信息)。这些有客户代理程序实现。
客户代理执行程序的代码在SoapHttpClientProtocol类中
a) System.Web.Service.Protocols.SoapHttpClientProtocol是客户代理程序的基类。
Invoke()方法:转换参数,建立一个SOAP消息,发送给Web服务。
Url属性:确定调用哪个web服务。
BeginInvoke() & EndInvoke():用于异步调用。
b) 其他客户协议:
HttpGetClientProtocol & HttpPostClientProtocol 类,仅执行简单的HTTP GET & HTTP POST请求,没有SOAP调用系统的开销。
但只能用于.NET客户机和服务器上都是使用.Net的情况。
如果使用的是不同技术,就只能使用SOAP协议。
客户程序:
在解决方案中创建一个新的应用程序。
添加一个服务引用--Project|Add service Reference--»
discover|Service in solution(先前创建的服务会显示出来)--»
在namespace上输入名称::WebServicesSample.
程序代码:
WebServicesSample.Service1SoapClient client = new WebServicesSample.Service1SoapClient(); //WebServiceSample就是上面添加用时输入的namespace;
//Service1SoapClient是生成的代理类(Service1.asmx & ~.cs),client为代理类的一个实例。
textBox2.Text = client.ReverseString(textBox1.Text); //代理类的实例,调用web服务的方法ReverseString
//Service1SoapClient派生于ClientBase«Service1Soap»基类,这个基类在Invoke()方法中创建了一个SOAP消息。
//WebServiceBingdingAttribute属性设置为Web服务:
....
[System.Web.Services.WebServiceBindingAttribute(Name="ServiceSoap", Namespace="http://www.areslab.com/webservices")] //标示符与web服务的标示符相同,绑定服务。
public partial class Service: System.Web.Services.Protocols.SoapHttpClientProtocol
{
public Service()
{ this.Url = SimpleClient.Properties.Settings.Default.SimpleClient_WebServicesSample_Service; } //构造函数中,url设置为Web服务。这个属性用于SoapHttpClientProtocol类,以请求一个服务。
}
________________
16. Ajax编程
Ajax基于以下技术:
DHTML, JavaScript, XmlHttpRequest, JSON(JavaScript Object Notation)
ASP.NET 2.0 需要下载AJAX 库和控件, ASP.NET 3.5包含了ASP.NET AJAX。
Microsoft提供了其他的一些工具,用于AJAX应用程序开发。可从 http://ajax.asp.net 下载。
ASP.NET AJAX服务器端控件:
ScriptManager: 每个AJAX页面都需要一个该控件实例;
UpdatePanel:部分更新功能;
Timer:定时调用一个函数;
UpdateProgress:发送请求时,显示进度。
ASP.NET AJAX客户端脚本扩展:
Array类扩展,Date类扩展,String类扩展,Sys名称空间,Sys.Net名称空间。 说明见P587页。
ScriptMannager的属性:
EnablePageMethods:指定 ASPX页面上的静态方法,是否可以从客户端 脚本中,作为web服务方法 进行调用
EnablePartialRendering:ture为激活UpdatePanel部分更新功能;
LoadScriptsBeforeUI:指定脚本放在 返回的HTML页面的位置,如果放在«head»上,就会在加载UI之前加载脚本;
ScriptMode:指定使用调试版 还是发布版 脚本;
ScriptPath:指定脚本坐在目录;
Services:包含 Web服务引用集合。
UpdatePanel控件:
属性:
ChildrenAsTriggers:为true时,将子控件设为触发器(子控件可以更新UpdatePanel的内容);
RenderMode:指定显示方式,UpdatePanelRenderMode.Block 或是 *.Inline。Block显示«div»,Inline显示«span»;
UpdateMode:设为 Always (会在每个Ajax回送时,全部更新)或 Conditional(更新依赖于触发器);
Triggers:指定AsyncPostbackTrigger 和 PostbackTrigger元素集合,指定了更新内容的时间(?)。
***************************************************
使用UpdatePanel控件:
1)添加ScriptManager控件:
建立站点,并在.aspx页面中添加控件。
«asp:ScriptManager ID="ScriptManager1" runat="server"» «/asp:ScriptManager»
2)添加UpdatePanel控件:
«asp:UpdatePanel ID="UpdatePanel1" runat="server"» «/asp:UpdatePanel»
3)在UpdatePanel内部添加标 签 和 按钮 控件:
«asp:UpdatePanel ID="UpdatePanel1" runat="server"»
«ContentTemplate»
«asp:Label ID="Label1" runat="server" Text="Label" » «/asp:Label»
«asp:Button ID="Button1" runat="server" Text="AJAX Postback" /»
«/ContentTemplate»
«/asp:UpdatePanel»
启动程序后,点击button,发送一个Ajax POST请求,而不是HTTP POST请求,只有UpdatePanel内的控件进行了刷新。页面内UpdatePanel控件之外的内容没有刷新。
(Ajax POST请求使用XmlHttpRequest对象给服务器发送一个请求。服务器只返回更新UI所需数据。然后,JavaScript代码就修改UpdatePanel内部的HTML控件。
一个页面可以有多个UpdatePanel。
********************************************************************
使用触发器更新:
当页面中有两组UpdatePanel控件时,在UpdatePanel控件的UpdateMode属性为Always时,无论点击那组控件中的按钮,两个组都会刷新。
当UpdateMode属性为Conditional时,只用Button所在的UpdatePanel中的控件才会刷新;或者,用触发器可以更新其他UpdatePanel中的控件。
选择其中一个UpdataPanel,点击 Triggers属性旁边的"..." , 添加一个AsyncPostBack触发器,把ControlID设置为其他的按钮的ID,比如:Button2,把EventName设置为Click。
通过上面的设置,当点击所指定的按钮时,就会更新这个UpdatePanel中的内容。
......
«asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"»
«ContentTemplate»
«asp:Label ID="Label1" runat="server" Text="Label"» «/asp:Label»
«asp:Button ID="Button1" runat="server" Text="Button" OnClick="OnButtonClick"/»
«/ContentTemplate»
«Triggers»
«asp:AsyncPostBackTrigger ControlID="Button2" EventName="Click"/»
«/Triggers»
«/asp:UpdatePanel»
Timer控件:
例:
在UpdatePanel控件中添加 Label 和 Timer控件,并将Timer的Interal属性设为5000,给Tick事件添加OnTick方法。
protected void OnTick(object sender,EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString();
}
启动程序后,每5秒更新一次Label里的内容。
UpdateProgress控件:
当后台操作超时,超过DisplayAfter属性指定的世,就显示«ProgressTemplate»模板的内容。
DisplayAfter默认500ms。
例:
«asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"» «/asp:ScriptManager»
«asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"»
«ProcessTemple»
Waiting......
«/ProcessTemplae»
«/asp:UpdateProgress»
«asp:UpdatePanel ID="UpdatePanel1" runat="server"»
........
«/asp:UpdatePanel»
*********************************************************************
应用Ajax的web服务:
1)建立站点后,添加一个Ajax的WCF服务(AJAX-enable WCF Service),命名为HelloService.svc,建立Web服务。
创建Ajax WCF服务,会在web.config中添加enableWebScript字段,给web服务添加JSON支持(这样web服务就能接受和返回 JavaScript客户端能使用的JSON对象了)。
«system.serviceModel»
«behaviors»
«endpointBefaviors»
«enableWebScript /»
«/endpointBehaviors»
«/behavior»
«serviceHostingEnvironment aspNetCompatibilityEnabled="true"»
...............
2)在HelloService.svc中添加Greeting()方法:
using System.ServiceModel;
.....
[ServiceContract(Namespace=" ")]
[AspNetComatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class HelloService
{
[WebGet]
[OperationContract]
public string Greeting(string name)
{
return "Hello, "+ name;
}
}
*************************************************************************************
3)建客户端,建一个AJAX Web窗体CallService.aspx
编辑aspx页面中的ScriptManager控件的属性,在属性编辑器中,点击Service属性的省略号按钮,add一个服务应用,把path属性改为HelloService.svc;
«asp:ScriptManager ID="ScriptManager1" runat="server"»
«service»
«asp:ServiceReference Path="HelloService.svc"»
«/service»
«/asp:ScriptManager»
在页面上添加HTML控件;
修改页面脚本块:
«script type="text/javascript"»
var helloService;
function pageload()
{
helloService = new HelloService(); //创建Web服务代理的实例。HelloService与ScriptManager的Service属性定义类型相同。
helloService.set_defaultSucceededCallback(helloSucceed); //用代理对象的set_defaultSucceededCallback方法,指定异步调用web服务成功时调用函数 helloSucceed(在下面)。
helloService.set_defaultFailedCallback(heelFailed); //用代理对象的set_defaultFailedCallback方法,指定异步调用web服务失败时调用函数 helloFailed(在下面)。
}
function helloSucceed(result)
{
var d = document.getElementById("result");
d.innerHTML = result;
}
function helloFailed(result) { ......... }
function callService()
{
var l = document.getElementById("input");
helloService.Greeting(l.value); //用代理对象实例(helloService)调用web服务。可以添加一个HTML Button调用callService,来调用Web服务。
}
«/script»
除了使用set_defaultSucceededCallback和set_defaultFailedCallback方法 设置默认方法外,还可以:
helloService.Greeting(l.value, helloSucceed, helloFailed,null); //单独指定 传送的 成功 和 失败函数。
*******************************************************************************************************************************
用AJAX扩展控件:
1)在www.asp.net/ajax/downloads下载ASP.NET AJAX控件工具集(AjaxControlToolkitFramework3.5-NoSource.zip),并解压缩。
2)添加扩展控件:
在工具箱中,右击--选Add Tab;创建一个新类别,并命名;
右击新类别的内容,选Choose Item, 找到刚解压缩的程序集(AjaxControlToolkit.dll)
把ajaxToolkit tagPrefix添加到web.config中,引用程序集AjaxControlToolkit.
«pages»
«controls»
«add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken="31BF3856AD364E35"" /»
........
«add tagPrefix="ajaxToolkit" namespace="AjaxControlToolkit" assembly=“AjaxControlToolkit” /»
«/controls»
«/pages»
3)在aspx页面中使用:
添加一个文本框,TextBox1,点击该控件的“智能标记”(把鼠标停在控件上,就会显示只能标记),从菜单中选Add Extender;
就会打开Extender Wizard,选择TextBoxWatermarkExtender(用来扩展)。
在文本框的属性编辑器中展开组 TextBox1WatermarkExtender,把WatermarkText属性设置成想显示的文本,比如:Enter your name之类的。
产生的代码如下:
«asp:TextBox ID="TextBox1" runat="server" » «/asp:TextBox»
«ajaxToolkit:TextBoxWatermarkExtender ID="TextBox1_TextBoxWatermarkExtender" runat="server" Enabled="True" TargetControlID="TextBox1" WatermarkText="Enter your name"»
«/ajaxToolkit:TextBoxWatermarkExtender»
TargetControlID用来关联到指定的文本框--TextBox1上。
________________
***************************************部署Web 应用程序******************************************
17.ASP.NET运行库必须用IIS配置,才能运行ASP.NET Web应用程序。
用IIS管理工具检查处理程序映射,就可以验证ASP.NET运行库是否配置。
其他信息见P601 & P602。
________________
18.IIS配置
创建应用程序池(Application Pools):
启动 IIS管理工具;
选择Application pools右击,选择Add Application Pool;
输入Name,选择程序.NET Framework version v2.0.50727,然后OK。
ASP.NET 3.5 和 ASP.NET 2.0使用的运行库都是.NET Framework version v2.0.50727。
创建Application poosl后,从IIS管理工具右边的Action类别中选择Application Pools(在vista界面中,其他不知道在哪儿选),就可以配置高级设置了。
************************
创建Web应用程序:
在IIS Manager中,选择Default Web Site;
右击,选择Add Application;
输入Web站点的物理路径 和 别名。选择创建好的Application Pool,然后,点OK;
完成。
配置好虚拟目录后,就可以发布Web站点了。
________________
19. 复制Web站点
在VS中打开Web应用程序;
在菜单中,点击 网站|复制网站(Website|Copy Web Site);
点击窗口顶部的 连接(Connect)按钮,选择要复制的目的地。可以双向复制,进行同步。
编译时在浏览器访问为文件时进行的。也可也使用.net运行库目录下的命令行工具aspnetc_compiler -v /BegVCSharpWebsite预编译站点BegVCSharpWebsite。
________________
20. 发布Web站点
打开Web应用程序;
在菜单选择 生成|发布网站(Build|Publish Web Site);
配置选项:
允许更新此编译站点:后台文件编译为程序集,前台用源码发布;
使用固定命名和单页程序集:为每个页面创建一个程序集,程序集有固定名称,下次发布时不变。这个选项允许部分更新Web站点,更新或增加程序集。
对编译程序集启用强命名:允许指定键文件,给程序集签名。
________________
21. 创建Window安装程序
如果,Web应用程序,需要共享程序集,就需要创建安装程序。
使用安装程序的优点是,虚拟目录由IIS配置,不需要手动创建虚拟目录。