第二个灵魂 发表于 2015-1-16 22:38:53

ASP.NET编程:ASP.NET 2.0的新增服务、控件与功能

有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。asp.net|控件  [导读]全文先容了ASP.NET2.0中新增的控件和功效,包含MasterPages,DataSource控件、Skin的撑持、GridView和DetailsView的引进,在此基本上,ASP.NET2.0的平安模子失掉了极年夜的进步,包含登录控件、脚色办理器、本性化等等方面的撑持,在类库方面也增添了很多新特征,如全新的代码分开模子、客户端回调等等,让读者关于ASP.NET的新特征有一个周全的懂得。

  在初次公诸于众以来的短短四年中,ASP.NET业已成为在Windows倾力撑持的服务器上运转的Web使用程序的清规戒律,而且将runat="server"增加到供天下各地Web开辟职员利用的辞汇表中。它还为人们所熟悉的Web编程的远景供应了一些启发:Web编程将以可以出现HTML和剧本和引发事务的服务器端控件为中央。

  在Microsoft.NETFramework的下一个次要版本中,ASP.NET2.0将挣脱某些不完美的情况并开展为一种完整成熟的产物。它的方针是将完成罕见Web编程义务所需的代码数目削减70%或更多。只管该方针十分宏壮,可是因为多种多样的新增服务、控件和功效(它们必定会使ASP.NET2.0像ASP.NET1.x之于ASP一样,使ASP.NET1.x明显进步),该方针是能够完成的。

  这里,我将为您大略先容一些希冀在ASP.NET2.0中看到的内容,关于几个精选的范畴举行深切会商而且供应一些示例程序来夸大关头的功效。一切代码示例均针对ASP.NET2.0的展望试版本天生和测试的,大概必要对某些代码示例举行修正,以便用于第一个测试版本。

  母版页(MasterPages)

  ASP.NET1.x中最凸起的弱点之一是它短少对页面模板的撑持。完善的是界说其他页面能够承继的“母版页”才能。开辟职员经由过程利用用户控件(它们能够简单地在页面之间复制)创立页面来填补这一缺点。在ASP.NET2.0中,因为到场了一个称作“母版页”的新增功效,以是不再必要这类技能。想想“可视化承继”,您就会了解母版页是干甚么用的了。起首,您必要界说一个母版页(个中包括您但愿在其他页面上显现的内容),而且利用ContentPlaceHolder控件来界说子页面能够将其内容拔出的地位。然后,您必要天生子页面―SPX文件,它利用(相似于)以下所示的指令来援用母版页:

<%@PageMasterPageFile="~/Foo.master"%>

  在子页面中,您利用Content控件来填写母版页中的占位符。在扫瞄器中出现子页面,呈现的内容将是在母版页和子页面中所界说内容的完善组合。

<%@Master%>

<html>
<bodyleftmargin="0"topmargin="0"rightmargin="0"
bottommargin="0"marginheight="0"marginwidth="0"

<!--Banner-->
<tablecellspacing="0"cellpadding="0"
style="background-image:url(images/stripes.gif);
background-repeat:repeat-x,repeat-y"width="100%"

<tr><tdalign="center">
<spanstyle="font-family:verdana;font-size:36pt;
font-weight:bold;color:white"

MasterPages
</span><br>
<spanstyle="font-family:verdana;font-size:10pt;
font-weight:normal;color:white"

ThisbannerprovidedbyMaster.master
</span>
</td></tr>
</table>

<!--Placeholderforcontentbetweenbannerandfooter-->
<formid="Content">
 <asp:ContentPlaceHolderID="Main"RunAt="server"/>
</form>

<!--Footer-->
<tablewidth="100%"><tr><tdalign="center">
<spanstyle="font-family:verdana;font-size:8pt;color:red">
Copyright(c)2004byMeInc.Allrightsreserved<br>
ThisfooterprovidedbyMaster.master
</span>
</td></tr></table>
</body>
</html>

Master.master

<%@PageMasterPageFile="~/Master.master"%>

<asp:ContentContentPlaceHolderID="Main"RunAt="server">
<tablewidth="100%"height="256px"><tr><tdalign="center">
<h2>ThiscontentprovidedbySubpage.aspx</h2>
</td></tr></table>
</asp:Content>

代码1Subpage.aspx
  代码1中所示的使用程序利用母版页来界说呈现在每一个页面上的页眉和页脚。子页面经由过程将Content控件拔出母版页的ContentPlaceHolder中,从而在页眉和页脚之间拔出内容。您应当注重婚配的ID和ContentPlaceHolderID,和母版页中的@Master指令。

  母版页在ASP.NET工具模子中失掉了充实撑持。System.Web.UI.Page类的特性是具有一个名为Master的新属性,该属性使子页面能够用编程体例来援用它的母版页和在个中界说的控件。母版页能够嵌套,而且能够包括可以在子页面中重写的默许内容。

<asp:ContentPlaceHolderID="Main"RunAt="server">
 Thisisdefaultcontentthatwillappearinsubpagesunlessexplicitlyoverridden
</asp:ContentPlaceHolder>
  别的,使用程序能够在Web.config中指定默许的母版页,以下所示:

<configuration>
<system.web>
 <pagesmasterPageFile="~/Foo.master"/>
</system.web>
</configuration>
  单个子页面享有重写默许母版页和指定它们本人的母版页的自在。

  最出色的部分是VisualStudio2005中对母版页的撑持。当加载子页面时,IDE将显现母版页中界说的内容的灰色、只读版本,和子页面中界说的内容的全色、完整可编纂版本。辨别这二者很简单,而且假如要编纂属于母版页的内容,那末您必要做的全体事变只是在IDE中翻开母版页。

  有关母版页的更多深切内容,请参阅相干的文章。
<P>  数据源控件

  数据绑定在ASP.NET1.x中占有着明显地位。几行地位得当的数据绑定代码能够代替大批查询数据库,并利用对Response.Write办法的反复挪用,从而将查询了局转换为HTML内容的ASP代码。

  上面的DataSource1.aspx页利用ASP.NET2.0数据绑定来显现SQLServerPubs数据库的一部分:

<html>
<body>
<formrunat="server">
<asp:SqlDataSourceID="Titles"RunAt="server"
ConnectionString="server=localhost;database=pubs;Integrated
Security=SSPI"
SelectCommand="selecttitle_id,title,pricefromtitles"
/>
<asp:DataGridDataSourceID="Titles"RunAt="server"/>
</form>
</body>
</html>
  SqlDataSource控件界说了数据源和对它实行的查询,而且DataGrid的DataSourceID属性指向SqlDataSource。当加载该页时,SqlDataSource控件就会实行查询,并将了局供应给DataGrid。

  固然,实践操纵中的数据绑定很少会云云复杂。假定您但愿缓存查询了局,大概利用在其他控件当选择的项目来参数化数据库查询。中的页利用一个SqlDataSource,用Northwind的Customers表中列出的国度/区域来添补一个下拉列表,并利用另外一个SqlDataSource,用在该下拉列表当选择的国度/区域中的一系列客户来添补一个DataGrid。请注重元素,它唆使DataGrid的SqlDataSource从下拉列表中猎取@country的值。还请注重绑定到该下拉列表的SqlDataSource中的EnableCaching和CacheDuration属性。这些声明将SELECTDISTINCT查询的了局缓存60秒。

  上述示例只是深刻地切磋了能够经由过程数据源控件完成的事情。比方,您可使用存储历程,可使用从查询字符串、用户输出、会话形态和Cookie中提取的值来参数化查询,而且能够指定控件是不是应当利用DataSet或DataReader。由于数据源控件包括数据适配器的功效,以是您乃至可使用数据源控件来更新数据库。跟着ASP.NET2.0终极公布日期的逼近,读者无望看到大批有关数据源控件的文章。

  只管我所会商的是数据绑定主题,但您还应当晓得ASP.NET2.0撑持简化的数据绑定语法。ASP.NET开辟职员能够找到与上面这个给人深入印象的表达式相似的表达式:
<%#DataBinder.Eval(Container.DataItem,"title")%>

  在ASP.NET2.0中,能够按以下情势写一个不异的表达式:
<%#Eval("title")%>

  除Eval运算符之外,ASP.NET2.0还撑持名为XPath和XPathSelect(它们利用指向XML文档中数据的XPath表达式)的运算符。

  主题与表面(skins)

  假如您不利用属性来丰厚控件,那末ASP.NET页面大概会显得十分单调。成绩在于:迄今为止,一次只能使用一个属性,而且您没法经由过程成组地设置控件的可视属性来付与控件主题。ASP.NET2.0供应了一项新功效,即输出主题和表面。该功效简化了天生优美页面的义务。

  要检察主题和表面的事情体例,请将以下指令增加到DataSource2.aspx中,如代码2所示:

<html>
<body>
<formrunat="server">
<asp:SqlDataSourceID="Countries"RunAt="server"
ConnectionString="server=localhost;database=northwind;
IntegratedSecurity=SSPI"
SelectCommand="selectdistinctcountryfromcustomersorderbycountry"
EnableCaching="true"CacheDuration="60"
/>
<asp:SqlDataSourceID="Customers"RunAt="server"
ConnectionString="server=localhost;database=northwind;
IntegratedSecurity=SSPI"
SelectCommand="select*fromcustomerswherecountry=@country"

<SelectParameters>
<asp:ControlParameterName="Country"
ControlID="MyDropDownList"
PropertyName="SelectedValue"
/>
</SelectParameters>
</asp:SqlDataSource>
<asp:DropDownListID="MyDropDownList"DataSourceID="Countries"
DataTextField="country"AutoPostBack="true"RunAt="server"
/>
<asp:DataGridDataSourceID="Customers"RunAt="server"/>
</form>
</body>
</html>

代码2DataSource2.aspx
  如今革新该页面。了局如中所示。


主题和表面的事情体例

  接上去,付与该页面完整分歧的表面,办法是:增加一个元素,而且变动@Page指令以唆使要利用的页面主题:

  @Page指令的新Theme属性以声明体例将主题使用到页面中。还可使用Page类的Theme属性以编程体例使用主题。主题是表面的汇合,而表面是使用于一个控件范例的一组可视属性。BasicBlue和SmokeAndGlass是ASP.NET2.0附带的几个预界说(或全局)主题中的两个。您能够在Microsoft.NETFramework...ASP.NETClientFilesThemes下的子目次中找到它们。

  您能够界说本人的主题和表面,而且自界说地将它们部署到使用程序Themes目次的子目次中。每一个子目次组成一个主题,而且主落款称与子目次称号不异。一个主题子目次包括一个或多个.skin文件和该主题利用的任何其他资本(比方,图象文件和款式表)。实践的表面界说包括在.skin文件中,而且十分相似于用来在ASPX文件中声明控件实例的标志。

  为申明这一点,请在包括DataSource2.aspx的文件夹中创立一个名为Themes的子目次。在该Themes目次中,创立一个名为ShockingPink的子目次。将以下内容复制到ShockingPink目次中的新建的.skin文件中:

<asp:DropDownListrunat="server"BackColor="hotpink"ForeColor="white"/>
<asp:DataGridrunat="server"BackColor="#CCCCCC"BorderWidth="2pt"
BorderStyle="Solid"BorderColor="#CCCCCC"GridLines="Vertical"
HorizontalAlign="Left"

<HeaderStyleForeColor="white"BackColor="hotpink"/>
<ItemStyleForeColor="black"BackColor="white"/>
<AlternatingItemStyleBackColor="pink"ForeColor="black"/>
</asp:DataGrid>
  接上去,将DataSource2.aspx中的@Page指令变动为:
<%@PageTheme="ShockingPink"%>

  上述操纵的了局无疑是已经创立过的最为华美的Web页之一。

  ShockingPink.skin界说了DropDownList和DataGrid控件的默许表面。表面文件不用与它们所属的主题具有不异的称号(只管它们一般云云)。一个主题能够包括多个.skin文件,而单个.skin文件能够为恣意数目的控件范例界说属性。别的,ASP.NET还能够辨别默许表面和非默许表面。依据界说,短少SkinID属性的表面是默许表面。非默许表面包括能够经由过程控件标志中的SkinID属性援用的SkinID。  新增控件

  ASP.NET2.0将引进约莫50种新的控件范例,以便匡助您天生丰厚的用户界面,同时使您不必对付HTML、客户端剧本和扫瞄器文档工具模子(DOM)的各类变化多端的举动。“新增控件”提纲栏列出了直至本文撰写时计划的新控件(Web部件控件除外)。

  DynamicImage控件简化了在Web页中显现静态天生的图象的义务。在已往,开辟职员常常编写自界说HTTP处置程序来处置静态图象天生,乃至更糟的是,处置ASPX文件中天生的图象。DynamicImage使得这两种手艺都过期了。代码4中的代码利用DynamicImage控件来绘制饼图。关头语句是谁人将图象位分派给控件的ImageBytes数组的语句。

  DynamicImage控件使用了新增的ASP.NET2.0图象天生服务。另外一种会见图象天生服务的办法是,在ASP.NET2.0的全新ASIX文件中静态天生图象。本文随附的示例文件(可从MSDNMagazineWeb站点上取得)包括一个名为DynamicImage.asix的文件,它展现了ASIX文件的要素。要运转该文件,请将DynamicImage.asix复制到Web服务器的某个假造目次中,然后在扫瞄器中激该死文件。


<%@ImportNamespace="System.Drawing"%>
<%@ImportNamespace="System.Drawing.Imaging"%>
<%@ImportNamespace="System.IO"%>

<html>
<body>
<asp:DynamicImageID="PieChart"DynamicImageType="ImageBytes"
RunAt="server"
/>
</body>
</html>

<scriptlanguage="C#"runat="server">
voidPage_Load(Objectsender,EventArgse)
{
 //Createabitmapanddrawapiechart
 Bitmapbitmap=newBitmap(240,180,PixelFormat.Format32bppArgb);
 Graphicsg=Graphics.FromImage(bitmap);
 DrawPieChart(g,Color.White,newdecimal[]
{100.0m,200.0m,300.0m,400.0m},240,180);
 g.Dispose();

 //AttachtheimagetotheDynamicImagecontrol
 MemoryStreamstream=newMemoryStream();
 bitmap.Save(stream,ImageFormat.Gif);
 bitmap.Dispose();
 PieChart.ImageBytes=stream.ToArray();
}

voidDrawPieChart(Graphicsg,Colorbkgnd,decimal[]vals,intwidth,intheight)
{
 //Erasethebackground
 SolidBrushbr=newSolidBrush(bkgnd);
 g.FillRectangle(br,0,0,width,height);
 br.Dispose();

 //Createanarrayofbrushes
 SolidBrush[]brushes=newSolidBrush;
 brushes=newSolidBrush(Color.Red);
 brushes=newSolidBrush(Color.Yellow);
 brushes=newSolidBrush(Color.Blue);
 brushes=newSolidBrush(Color.Cyan);
 brushes=newSolidBrush(Color.Magenta);
 brushes=newSolidBrush(Color.Green);

 //Sumtheinputs
 decimaltotal=0.0m;
 foreach(decimalvalinvals)
 total+=val;

 //Drawthechart
 floatstart=0.0f;
 floatend=0.0f;
 decimalcurrent=0.0m;

 for(inti=0;i<vals.Length;i++)
 {
  current+=vals;
  start=end;
  end=(float)(current/total)*360.0f;
  g.FillPie(brushes,0.0f,0.0f,width,height,
  start,end-start);
 }

 //Cleanupandreturn
 foreach(SolidBrushbrushinbrushes)
 brush.Dispose();
}
</script>

代码4DynamicImage.aspx  ASP.NET2.0中初次表态的另外一个风趣且十分有效的控件是MultiView控件。与View控件搭配利用时,MultiView可用来创立包括多个逻辑视图的页面。一次只能显现一个视图(其索引被分派给MultiView的ActiveViewIndex属性的谁人视图),但您能够经由过程变动举动视图索引来切换视图。关于利用选项卡或其他控件来让用户在逻辑页之间举行导航的页面而言,MultiViews长短常幻想的。

  代码5中的页面利用一个MultiView来显现Pubs数据库Titles表的两个分歧视图:个中一个用GridView出现,另外一个用DetailsView出现。视图切换是经由过程从下拉列表中举行选择来完成的。请注重,标志中的AllowPaging属性利用户能够扫瞄DetailsView中的纪录。
<%@PageTheme="BasicBlue"%>

<html>
<body>
<formrunat="server">
<asp:SqlDataSourceID="Titles"RunAt="server"
ConnectionString="server=localhost;database=pubs;
IntegratedSecurity=SSPI"
SelectCommand="selecttitle_id,title,pricefromtitles"
/>
<asp:DropDownListID="ViewType"AutoPostBack="true"
OnSelectedIndexChanged="OnSwitchView"RunAt="server"

<asp:ListItemText="GridView"Selected="true"RunAt="server"/>
<asp:ListItemText="DetailsView"RunAt="server"/>
</asp:DropDownList>
<asp:MultiViewID="Main"ActiveViewIndex="0"RunAt="server">
<asp:ViewRunAt="server">
<asp:GridViewDataSourceID="Titles"RunAt="server"/>
</asp:View>
<asp:ViewRunAt="server">
<asp:DetailsViewDataSourceID="Titles"AllowPaging="true"
RunAt="server"
/>
</asp:View>
</asp:MultiView>
</form>
</body>
</html>

<scriptlanguage="C#"runat="server">
voidPage_Load(Objectsender,EventArgse)
{
 if(IsPostBack)
  DataBind();
}

voidOnSwitchView(Objectsender,EventArgse)
{
 Main.ActiveViewIndex=ViewType.SelectedIndex;
}
</script>

代码5MultiView.aspx  GridView和DetailsView控件

  DataGrid是ASP.NET中最受接待的控件之一,但在某些方面,它同样成为本人乐成的就义品:云云丰厚的功效,以致于让ASP.NET开辟职员不满意于此,而是但愿它能供应更多功效。DataGrid控件在ASP.NET2.0中并没有产生太年夜变更,只是增加了两个分离名为GridView和DetailsView的新控件,它们供应了一般请求DataGrid控件所具有的功效,而且还到场了一些属于它们本人的新功效。

  GridView出现HTML表的体例与DataGrid一样,但与DataGrid分歧的是,GridView能够完整依托本人来分页和排序。GridView还撑持比DataGrid品种更加丰厚的列范例(在GridView用语中称为字段范例),而且它们具有更加智能的默许出现举动,可以主动出现Boolean值(比方,经由过程复选框)。GridView也能够简单地与DetailsView搭配利用,以创立主-从视图。GridView控件的次要缺点是:像DataGrid一样,它经由过程将信息传回到服务器来完成它该做的年夜部合作作。

  代码6中的页面分离利用了GridView和DetailsView,以创立Pubs数据库的Titles表的复杂主-从视图。SqlDataSource控件为其他控件供应数据,而绑定到DetailsView控件的SqlDataSource中的SelectParameter使DetailsView可以显现GridView中以后选择的纪录。能够经由过程单击GridView的Select按钮(该按钮因标志中的AutoGenerateSelectButton="true"属性而存在)来选择纪录。
<%@PageTheme="BasicBlue"%>

<html>
<body>
<formrunat="server">
<asp:SqlDataSourceID="Titles1"RunAt="server"
ConnectionString="server=localhost;database=pubs;IntegratedSecurity=SSPI"
SelectCommand="selecttitle_id,title,pricefromtitles"
/>
<asp:SqlDataSourceID="Titles2"RunAt="server"
ConnectionString="server=localhost;database=pubs;Integrated
Security=SSPI"
SelectCommand="selecttitle_id,title,pricefromtitleswhere
title_id=@title_id"

<SelectParameters>
<asp:ControlParameterName="title_id"
ControlID="MyGridView"
PropertyName="SelectedValue"
/>
</SelectParameters>
</asp:SqlDataSource>
<table><tr><td>
<asp:GridViewID="MyGridView"DataSourceID="Titles1"
Width="100%"RunAt="server"AutoGenerateColumns="false"
SelectedIndex="0"AutoGenerateSelectButton="true"
DataKeyNames="title_id"

<Columns>
<asp:BoundFieldHeaderText="TitleID"
DataField="title_id"
/>
<asp:BoundFieldHeaderText="BookTitle"DataField="title"/>
<asp:BoundFieldHeaderText="Price"DataField="price"
DataFormatString="{0:c}"NullDisplayText="TBD"
/>
</Columns>
</asp:GridView>
</td></tr>
<tr><td>
<asp:DetailsViewDataSourceID="Titles2"RunAt="server"
AutoGenerateRows="false"Width="100%"

<Fields>
<asp:BoundFieldHeaderText="TitleID"
DataField="title_id"
/>
<asp:BoundFieldHeaderText="BookTitle"
DataField="title"
/>
<asp:BoundFieldHeaderText="Price"DataField="price"
DataFormatString="{0:c}"NullDisplayText="TBD"
/>
</Fields>
</asp:DetailsView>
</td></tr></table>
</form>
</body>
</html>

代码6MasterDetail.aspx  请注重GridView和DetailsView控件顶用于界说字段范例的和元素。这些元素实践上等效于DataGrid控件中的元素。表1列出了受撑持的字段范例。出格主要的是ImageField和DropDownListField,它们都能够无效地减少今朝开辟职员为在DataGrid中包括图象和数据绑定下拉列表而编写的年夜部分代码。
字段范例形貌AutoGeneratedField默许字段范例BoundField绑定到数据源指定列ButtonField显现一个按钮、图片按钮大概链接按钮CheckBoxField显现一个复选框CommandField显现一个用于选择大概编纂的按钮DropDownListField显现一个下拉列表HyperLinkField显现一个超等链接ImageField显现一个图片TemplateField内容由HTML模板来界说
表1GridViewandDetailsView字段范例
  新增的办理功效

  ASP.NET1.x的另外一个分明的缺点(已在ASP.NET2.0中失掉修复)是基本没有效于办理Web站点的接口(不管是声明性接口仍是编程接口)。在已往,变动设置设置意味着启动记事本并编纂Machine.config或Web.config,但如今不再必要这么做了。ASP.NET2.0具有一个完美的办理API,它简化了读取和写进设置设置的义务。它还包含一个办理GUI,您能够经由过程在扫瞄器中哀求Webadmin.axd来显现该GUI,如所示。



办理GUI
  只管在撰写本文时髦不完美,但Webadmin.axd被计划为使您能够设置ASP.NET2.0中包括的各类服务(如成员身份和脚色办理服务)、检察Web站点统计信息和使用平安设置。

  成员身份服务

  ASP.NET2.0中新增的最好功效之一是新的成员身份服务,它供应了用于创立和办理用户帐户的易于利用的API。ASP.NET1.x年夜范围引进了窗体身份考证,但仍旧请求您编写相称数目的代码来实行实践操纵中的窗体身份考证。成员身份服务弥补了ASP.NET1.x窗体身份考证服务的不敷,而且使完成窗体身份考证变得比之前复杂很多。

  成员身份API经由过程两个新的类公然:Membership和MembershipUser。前者包括了用于创立用户、考证用户和完成其他事情的静态办法。MembershipUser代表单个用户,它包括了用于检索和变动暗码、猎取前次登录日期和完成相似事情的办法和属性。比方,上面的语句接纳用户名和暗码作为参数,并前往true或false来唆使它们是不是无效。它代替了对ASP.NET1.x使用程序中、利用ActiveDirectory?或后端数据库来考证凭证的浅易办法的挪用,以下所示:


boolisValid=Membership.ValidateUser(username,password);
  上面的语句前往一个MembershipUser工具,该工具暗示用户名为“jeffpro”的用户:

MembershipUseruser=Membership.GetUser("jeffpro");
  以下语句检索一个已注册用户的电子邮件地点(假定纪录了电子邮件地点):

stringemail=user.Email;
  成员身份服务所办理的用户名、暗码和其他数据存储在那里?像ASP.NET2.0中的几近一切形态办理服务一样,成员身份是基于供应程序的。供应程序是使服务能够与物理数据源举行交互的模块。ASP.NET2.0将包括MicrosoftAccess数据库、SQLServer数据库和ActiveDirectory的成员身份供应程序,而且还大概包括其他数据存储的成员身份供应程序。

  默许情形下,成员身份服务利用Access供应程序,并将成员身份数据存储在使用程序的Data子目次中名为AspNetDB.mdb的文件中。能够经由过程Web.config的部分选择备用供应程序。可让Webadmin.axd修正Web.config,而不用本人举行修正。上面的内容节选自Web.config(在Webadmin.axd创立了一个名为WhidbeyLogin的SQLServer?数据库,并将成员身份服务设置为利用该数据库以后):

<membershipdefaultProvider="WhidbeyLogin">
<providers>
<addname="WhidbeyLogin"
type="System.Web.Security.SqlMembershipProvider,..."
connectionStringName="webAdminConnection632112624221191376"
applicationName="/Whidbey"requiresUniqueEmail="false"
enablePasswordRetrieval="true"enablePasswordReset="false"
requiresQuestionAndAnswer="false"
passwordFormat="Encrypted"
/>
</providers>
</membership>
  connectionStringName属性援用了Web.config的新部分中的毗连字符串。ASP.NET2.0将包括加密这部分的Web.config以回护数据库毗连字符串的才能。

  Webadmin.axd的用处其实不仅限于创立数据库和选择成员身份供应程序:它还能够用于创立用户、办理凭证和其他用处。在Webadmin.axd和成员身份API之间,还存在用于办理站点注册用户的声明性手腕和编程手腕。这是从ASP.NET1.x向前迈出的一年夜步,它在很年夜水平大将凭证办理的成绩留给用户本人去向理。

  登录控件

  成员身份服务自己就明显削减了考证登录和办理用户所需的代码量,别的另有一系列称为登录控件的新控件使窗体身份考证变得加倍简单。登录控件能够与成员身份服务共同利用,也能够不与其共同利用,但它们与该服务之间的集成性十分好,以致于当登录控件与成员身份服务一同利用时,一些基础义务(比方,考证用户名和暗码和用电子邮件发送忘记的暗码)一般不用编写任何代码就能够完成。“新增控件”提纲栏包括了企图随ASP.NET2.0一同供应的一系列登录控件。


Login控件

  中所示的Login控件是登录控件系列的中心控件。除供应具有高度可自界说性的UI之外,它还可以挪用Membership.ValidateUser来考证用户名和暗码。Login控件还能够挪用FormsAuthentication.RedirectFromLoginPage,将用户重定向到他们在被重定向到登录页时实验抵达的页面。然后,FormsAuthentication.RedirectFromLoginPage将收回身份考证Cookie。在本文稍后的部分中,您将看到Login和其他登录控件的事情体例。<P>  脚色办理器

  假如不撑持基于脚色的平安性,那末成员身份服务和登录控件将是不完美的。在ASP.NET1.x中,要将窗体身份考证与脚色分离起来,必要编写代码以将脚色信息映照到各个传进的哀求。ASP.NET2.0中新的脚色办理器(它能够与成员身份服务共同利用,也能够不与其共同利用)作废了对此类代码的需求,而且简化了基于脚色授与用户会见各类资本权限的义务。

  脚色办理是基于供应程序的,它经由过程Web.config启用。脚色办理器经由过程新的Roles类来公然API,该类公然了名为CreateRole、DeleteRole和AddUserToRole等的办法。值得注重的是,您也许永久不必要挪用这些办法,由于Webadmin.axd完整可以创立脚色、将用户分派给脚色和完成其他义务。一旦启用,基于脚色的平安性就可以够利用所供应的脚色信息和Web.config文件中的URL身份考证指令来事情―这与ASP.NET1.x中您已熟习的URL身份考证不异。

  既然您已熟习了成员身份服务、登录控件和ASP.NET脚色办理器,那末您也许但愿看到同时利用这三者的示例。本文可下载的代码示例包括一个两页的使用程序,它演示了VisualStudio2005款式的窗体身份考证。要部署该使用程序并对其举行测试,请起首将PublicPage.aspx、LoginPage.aspx和Web.config复制到Web服务器的某个假造目次中。在该假造目次中创立一个名为Secure的子目次,然后将ProtectedPage.aspx和其他Web.config文件复制到该子目次中。

  启动Webadmin.axd,而且将站点设置为利用窗体身份考证,将成员身份和脚色服务设置为利用您选择的供应程序。同时,还要创立名为Bob和Alice的用户和名为Manager和Developer的脚色。将Bob指定为Manager脚色,将Alice指定为Developer脚色。(我不会列出一切步骤,由于在您利用任一办法浏览本文之前,它们极可能会改动。侥幸的是,Webadmin.axd相称直不雅,而且它具有导游,能够引诱您完成设置历程。)

  接上去,在扫瞄器中激活PublicPage.aspx,并单击“ViewSecretMessage”按钮以检察ProtectedPage.aspx。ASP.NET会将您重定向到LoginPage.aspx,该页面利用Login控件来哀求用户名和暗码。利用Bob的用户名和暗码登录。ProtectedPage.aspx应当显现在扫瞄器窗口中,由于Bob是Manager,而且能够经由过程Secure目次中的Web.config文件将会见权授与司理。请注重LoginName控件显现的用户名和LoginStatus控件显现的“Logout”链接。最初,封闭扫瞄器,然后从头翻开它偏重新激活PublicPage.aspx。单击“ViewSecretMessage”并以Alice的身份登录。这一次,您将没法抵达ProtectedPage.aspx,由于Alice不是司理。

  我利用了一个相似的使用程序来说述ASP.NET1.x中的窗体身份考证,但1.x版本请求编写十分多的代码。2.0版本因其简便而分歧平常,特别是没有任何用于考证在登录窗体中键进的凭证、大概将用户名映照到脚色的代码。假如您仍旧不信任,请实验用ASP.NET1.x完成统一使用程序!别的,请确保查验Webadmin.axd对Web.config所作的变动。除其他内容之外,您还应当看到一个启用脚色Manager而且大概会指定脚色办理供应程序的元素。

  您大概很想晓得脚色Manager是不是经由了到数据库(在个中,脚色被存储到每一个哀求中)的往复路程。值得光荣的是,谜底是“否”。它将脚色编码到Cookie中,而且为了保密而将它们加密。假如一个用户对应了浩瀚的脚色(这类情形不太大概产生),以致于没法将这些脚色编码到一个Cookie中,则该Cookie将包括一个比来利用脚色的列表,而且仅在心甘情愿时才查询数据库。

  本性化

  另外一个新增的服务是本性化,它供应了一种现成的办理计划,用于办理存储站点用户的本性化设置成绩。今朝,此类设置一般存储在Cookie、后端数据库或这二者中。不管这些设置存储在那边,ASP.NET1.x都不克不及供应甚么匡助。这必要由您来设置和办理后端数据存储,和利用经由身份考证的用户名、Cookie或其他某种机制来联系关系本性化数据。

  ASP.NET2.0本性化服务使得存储各个用户的设置和随便检索这些设置变得十分简单。该服务基于用户设置文件―您可使用新的元素在Web.config中予以界说。上面的代码节选自Web.config:

<profile>
<properties>
<addname="Theme"/>
<addname="Birthday"Type="System.DateTime"/>
<addname="LoginCount"Type="System.Int32"defaultValue="0"/>
</properties>
</profile>
  它界说了一个包括三个属性的设置文件:一个名为Theme的字符串,一个名为Birthday的DateTime值,和一个名为LoginCount的整数。前面这个属性被付与默许值0。

  在运转时,您可使用页面的Profile属性(该属性援用包括该设置文件中界说的属性的静态编译类的实例)来会见以后用户的这些属性。比方,以下语句可从以后用户的设置文件中读取属性值:

stringtheme=Profile.Theme;
DateTimebirthday=Profile.Birthday;
intlogins=Profile.LoginCount;
  还能够将值付与设置文件属性:

Profile.Theme="SmokeAndGlass";
Profile.Birthday=newDateTime(1959,9,30);
Profile.LoginCount=Profile.LoginCount+1;
  本性化服务的一个分明上风是强范例化。另外一个上风在于本性化数据是按需读写的。请将此预会话形态(不管是不是利用,城市将其加载并保留到每一个哀求中)举行对照。可是,本性化服务的最年夜上风大概在于您不用显式地将数据存储在任何地位;体系会替您完成该事情,而且它会永世性地存储数据,以便数据在您必要时随时可用。设置文件不会像会话那样超时。

  那末,本性化数据存储在那里呢?这要依详细情形而定。本性化服务基于供应程序,因而您能够将其设置为利用任何可用的供应程序。ASP.NET2.0将最少附带两个本性化供应程序:一个用于Access,另外一个用于SQLServer。假如您不另行指定,则本性化服务将利用Access供应程序,默许情形下,该供应程序会将本性化数据存储在当地DataAspNetDB.mdb中。您能够经由过程修正Web.config(手动或利用Webadmin.axd)来改用SQLServer数据库。假如您不但愿将本性化数据存储在Access数据库或SQLServer数据库中,则能够编写本人的供应程序。

  默许情形下,ASP.NET利用经由身份考证的用户名作为所存储的本性化数据的键,但您也能够将其设置为撑持匿名用户。起首,经由过程将以下语句增加到Web.config中来启用匿名标识:

<anonymousIdentificationenabled="true"/>

  然后,将allowAnonymous="true"增加到您要为匿名用户存储的设置文件属性中:
<name="Theme"allowAnonymous="true"/>

  如今,Theme属性能够作为本性化设置利用,而不管站点的挪用方是不是经由了身份考证。

  默许情形下,匿名标识利用Cookie来标识回返用户。由撑持的属性能够用各类体例来设置这些Cookie。比方,您能够指定Cookie称号,并指明是不是应当将该Cookie的内容加密。您还能够将本性化服务设置为利用无Cookie的匿名标识,因而它将依托URLMunging来标识回返用户。乃至还存在一个主动检测选项:假如哀求扫瞄器撑持Cookie,则利用Cookie;假如不撑持,则利用URLMunging。

  要检察本性化的事情体例,请运转本文随附的下载材料中的Personalize.aspx示例。它会让站点的每一个会见者选择一个主题,然跋文录该主题,而且每当该会见者前往时都将使用该主题。请注重,该主题是在页面的PreInit事务(它是一个新事务,它的引发工夫乃至早于Init)中以编程体例使用于该页面的。

  在您运转该示例之前,必要启用匿名标识,并界说一个包括名为Theme的字符串属性的设置文件。以下代码行显现了实行上述两项义务的Web.config文件:

<configuration>
<system.web>
<anonymousIdentificationenabled="true"/>
<profile>
<properties>
<propertyname="Theme"allowAnonymous="true"/>
</properties>
</profile>
</system.web>
</configuration>
  SQL缓存依附性

  ASP.NET1.x中使人遗憾地短少的另外一项功效是数据库缓存依附性。能够将ASP.NET使用程序缓存中安排的项目与其他缓存项目接洽起来,大概与文件体系中的工具接洽起来,但不克不及与数据库实体接洽起来。ASP.NET2.0经由过程引进SQL缓存依附性来改正这一因为忽略而酿成的毛病。

  SQL缓存依附性由新的SQLCacheDependency类的实例暗示。它们的用法十分复杂。上面的语句将一个名为ds的数据集拔出到使用程序缓存中,而且在该数据集和Northwind数据库的Products表之间创立依附性:

Cache.Insert("ProductsDataSet",ds,newSqlCacheDependency("Northwind","Products");
  假如Products表的内容改动,则ASP.NET会主动删除该数据集。

  SQL缓存依附性还能够与ASP.NET输入缓存共同利用。上面的指令唆使ASP.NET缓存来自包括页面的输入,直至Products表的内容改动大概满60秒为止(满意任一前提便可):

<%@OutputCacheDuration="60"VaryByParam="None"
SqlDependency="Northwind:Products"
%>
  SQL缓存依附性合用于SQLServer7.0、SQLServer2000和行将问世的SQLServer2005。关于SQLServer2005,无需举行任何筹办;但必需将SQLServer7.0和SQLServer2000数据库设置为撑持SQL缓存依附性。筹办事情触及到创立数据库触发器,和创立一个特别的表,以供ASP.NET在断定是不是已产生变动时参考。该表由一个背景线程利用可设置的轮询距离(默许为5秒钟)来按期轮询。在SQLServer2005中,要检测变动,既不必要特别的表,也不必要轮询。别的,SQLServer2005缓存依附性能够外行级使用,而SQLServer7.0和SQLServer2000缓存依附性在表级事情。您可使用Aspnet_regsqlcache.exe工具或Webadmin.axd来筹办数据库,以使其撑持SQL缓存依附性。<P>  新的静态编译模子

  ASP.NET1.x中引进的浩瀚立异之一是:体系可以在初次会见您的代码时对其举行编译。可是,只要页面可以被主动编译,而且帮助类(如数据会见组件)必需独自编译。

  ASP.NET2.0扩大了静态编译模子,以便可以主动编译几近一切的组件。bin目次仍旧保存以便完成向后兼容性,但它如今增加了名为Code和Resources的目次。Code目次中的C#和VisualBasic文件和Resources目次中的RESX和RESOURCE文件被ASP.NET主动编译并缓存在体系子目次中。别的,落进Code目次中的Web服务形貌言语(WSDL)文件被编译为Web服务代办署理,而XML架构界说言语(XSD)文件被编译为范例化数据集。经由过程Web.config,还能够扩大这些目次以撑持其他文件范例。

  预编译而且在不带源代码的情形下举行部署

  提到静态编译,与ASP.NET1.x有关的最多见成绩之一是:是不是能够预编译页面,以免在初次会见页面时产生的编译提早?只管该成绩自己在某种水平上可有可无(提早十分小,而且提早的开支被不计其数乃至数以百万的后续哀求所分摊),但Microsoft仍旧感应有需要接纳响应的措施来加重开辟职员的担心。这一“措施”就是可以经由过程提交对名为precompile.axd的幻像资本的哀求,来预编译使用程序中的一切页面。

  但预编译其实不仅限于此。另外一个常常被哀求的功效是:可以将全部使用程序预编译为能够在不带源代码的情形下举行部署的托管程序集(该功效在宿主计划中特别有效)。ASP.NET2.0包括一个名为Aspnet_compiler.exe的新的命令行工具,它可以实行预编译而且在不带源代码的情形下举行部署;VisualStudio2005将包括相似的功效。上面的命令将预编译Web1目次中的使用程序,而且在不带源代码的情形下将其部署到Web2:

Aspnet_compiler-v/web1-pc:web1c:web2

  以后,方针目次将包括空的ASP.NET文件(ASPX、ASCX、ASIX等等)和源目次中存在的一切静态内容(如HTML文件、.config文件和图象文件)的正本。在不带源代码的情形下举行部署其实不会为您的常识产权供应牢不成破的回护,由于伶俐的ISP仍旧能够经由过程反编译天生的程序集来弄分明使用程序的前因后果,可是,它的确对一样平常的代码夺取者设置了更年夜的拦阻。

  新的代码分开模子

  ASP.NET1.x撑持两种编程模子:内联模子―HTML和代码共存于统一个ASPX文件中;代码埋没模子―它将HTML分开到ASPX文件中,并将代码分开到源代码文件(比方,C#文件)中。ASP.NET2.0引进了第三个模子:一种新的代码埋没情势,它依附于VisualC#和VisualBasic.NET编译器中的不完整类撑持。新的代码埋没办理了本来的代码埋没中存在的一个末路人的成绩:传统的代码埋没类必需包括受回护的字段,这些字段的范例和称号必要映照到ASPX文件中声明的响应控件。

  代码7显现了新的代码埋没模子的事情体例。Hello.aspx包括页面的声明部分,Hello.aspx.cs包括代码。您应当注重@Page指令中的CompileWith属性。别的,请注重MyPage类中短少的字段(它们供应到ASPX文件中声明的控件的映照)。旧款式的代码埋没仍旧受撑持,但新款式将是从此的首选编程模子。一点都不奇异,VisualStudio2005生成就撑持新的代码分开模子。


Hello.aspx

<%@PageCompileWith="Hello.aspx.cs"ClassName="MyPage"%>

<html>
<body>
<formrunat="server">
<asp:TextBoxID="Input"RunAt="server"/>
<asp:ButtonText="Test"RunAt="server"/>
<asp:LabelID="Output"RunAt="server"/>
</form>
</body>
</html>

Hello.aspx.cs

usingSystem;

partialclassMyPage
{
 voidOnTest(Objectsender,EventArgse)
 {
  Output.Text="Hello,"+Input.Text;
 }
}

代码7Codebehind模子
  客户端回调办理器

  ASP.NET2.0中我最喜好的功效之一就是由新的客户端回调办理器供应的“轻量级回发”功效。在已往,ASP.NET页面必需回发给服务器才干挪用服务器端代码。回发是低效的,由于它们将包括由页面控件天生的一切回发数据。它们还强迫页面革新,从而招致不雅的闪灼。

  ASP.NET2.0引进了客户端回调办理器,它使页面无需完整回发就能够回调到服务器。回调是异步的,而且经由过程XML-HTTP来完成。它们不包括回发数据,而且不会强迫页面革新。(在服务器端,页面像寻常一样实行至PreRender事务,但期近将出现任何HTML之前中断。)它们的确必要撑持XML-HTTP协定的扫瞄器(这一般意味着MicrosoftInternetExplorer5.0或更高版本)。

  利用客户端回调办理器触及三个步骤。起首,挪用Page.GetCallbackEventReference以猎取对某个特定函数(能够从客户端剧本中挪用该函数,以实行到服务器的XML-HTTP回调)的援用。ASP.NET供应了该函数的称号和完成。其次,在客户端剧本中编写一个将在回调前往时挪用的办法。办法称号是传送给GetCallbackEventReference的参数之一。第三,在页面中完成ICallbackEventHandler接口。该接口包括一个办法―RaiseCallbackEvent,当回调产生时,该办法将在服务器端挪用。RaiseCallbackEvent所前往的字符串将被前往到第二步所述的办法。

  代码8中的代码显现了客户端回调的事情体例,而且演示了它们的一个十分实践的用处。该页面显现了一个哀求姓名和地点的窗体。在ZipCode字段中键进378xx或379xx邮政编码,然后单击Autofill按钮,City字段中将显现一个称号。值得注重的是,该页面会前往到服务器以猎取乡村称号,但它利用客户端回调而不是完整回发来完成此事情。在实践操纵中,它能够找到某个数据库以将邮政编码转换为乡村称号。请注重,该页面其实不像页面在回发到服务器时一般所做的那样举行从头绘制。相反,更新是疾速且简便的!

<%@ImplementsInterface="System.Web.UI.ICallbackEventHandler"%>

<html>
<body>
<h1>PleaseRegister</h1>
<hr>
<formrunat="server">
<table>
<tr>
<td>FirstName</td>
<td><asp:TextBoxID="FirstName"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>LastName</td>
<td><asp:TextBoxID="LastName"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>Address1</td>
<td><asp:TextBoxID="Address1"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>Address2</td>
<td><asp:TextBoxID="Address2"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>City</td>
<td><asp:TextBoxID="City"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>State</td>
<td><asp:TextBoxID="State"RunAt="server"/></td>
<td></td>
</tr>
<tr>
<td>ZipCode</td>
<td><asp:TextBoxID="Zip"RunAt="server"/></td>
<td><asp:ButtonID="AutofillButton"Text="Autofill"
RunAt="server"/></td>
</tr>
</table>
</form>
</body>
</html>

<scriptlanguage="javascript">
//Functioncalledwhencallbackreturns
function__onCallbackCompleted(result,context)
{
//DisplaythestringreturnedbytheserversRaiseCallbackEvent
//methodintheinputfieldnamed"City"
document.getElementById(City).value=result;
}
</script>

<scriptlanguage="C#"runat="server">
voidPage_Load(Objectsender,EventArgse)
{
 //Getcallbackeventreference(e.g.,"__doCallback(...)")
 stringcbref=GetCallbackEventReference(this,"document.getElementById(Zip).value",
"__onCallbackCompleted","null","null");

 //WirethecallbackeventreferencetotheAutofillbuttonwith
 //anonclickattribute(andadd"returnfalse"toeventreference
 //topreventapostbackfromoccurring)
 AutofillButton.Attributes.Add("onclick",cbref+";returnfalse;");
}

//Server-sidecallbackeventhandler
stringICallbackEventHandler.RaiseCallbackEvent(stringarg)
{
 if(arg.StartsWith("378"))
  return"OakRidge";
 elseif(arg.StartsWith("379"))
  return"Knoxville";
 else
  return"Unknown";
}
</script>

代码8callback.aspx<P>  考证组

  考证控件是ASP.NET1.x中更加出色的立异。诸如RequiredFieldValidator和RegularExpressionValidator之类的控件使开辟职员可以在客户端和服务器长进行更加智能的输出考证,而不用成为客户端剧本编写和扫瞄器DOM方面的专家。遗憾的是,版本1.x考证控件存在一个致命的缺点,即:没有一种对照好的办法来将这些控件组合在一同,以便页面的一个部分上的考证程序能够重写该页面其他部分上的考证程序,而且不管其他考证程序的形态怎样,都可使回发产生。

  该成绩由ValidationGroups1.aspx分析,它包括在您能够针对本文下载的示例中。页面的计划者估计用户可以填写一组TextBox并回发到服务器,而不用同时填写另外一个组,但它其实不按此体例事情。除非一切输出字段都被添补,不然考证程序将埋怨不休,如2所示。


ASP.NET1.x中的考证控件

  ASP.NET2.0中的新考证组功效与日俱增地办理了该成绩。如今,可使用ValidationGroup属性来组合考证控件。能够用不异的体例将按钮控件分派给组,而且当一个组中的一切考证程序都对输出感应中意时,它们才同意回发产生,固然,条件是回发是由考证程序统一组中的控件天生的。ValidationGroups2.aspx演示了该手艺(拜见代码9)。从外表上看,该页面与ValidationGroups1.aspx完整不异。但在外部,它们却完整分歧。如今,您能够填写任一组TextBox,而且经由过程单击TextBox考证组中的按钮举行回发。

<html>
<body>
<formrunat="server">
<h1>NewUsers</h1>
<table>
<tr>
<td>UserName</td>
<td><asp:TextBoxID="NewUserName"RunAt="server"/></td>
<td><asp:RequiredFieldValidatorValidationGroup="NewUsers"
ControlToValidate="NewUserName"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBoxID="NewPassword1"TextMode="Password"
RunAt="server"/></td>
<td><asp:RequiredFieldValidatorValidationGroup="NewUsers"
ControlToValidate="NewPassword1"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td>RetypePassword</td>
<td><asp:TextBoxID="NewPassword2"TextMode="Password"
RunAt="server"/></td>
<td><asp:RequiredFieldValidatorValidationGroup="NewUsers"
ControlToValidate="NewPassword2"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td>E-MailAddress</td>
<td><asp:TextBoxID="NewEMail"RunAt="server"/></td>
<td><asp:RequiredFieldValidatorValidationGroup="NewUsers"
ControlToValidate="NewEMail"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td></td>
<td><asp:ButtonValidationGroup="NewUsers"
Text="CreateAccount"
RunAt="server"/></td>
<td></td>
</tr>
</table>
<hr>
<h1>ExistingUsers</h1>
<table>
<tr>
<td>UserName</td>
<td><asp:TextBoxID="UserName"RunAt="server"/></td>
<td><asp:RequiredFieldValidator
ValidationGroup="ExistingUsers"
ControlToValidate="UserName"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBoxID="Password"TextMode="Password"
RunAt="server"/></td>
<td><asp:RequiredFieldValidator
ValidationGroup="ExistingUsers"
ControlToValidate="Password"ErrorMessage="Required"
RunAt="server"/></td>
</tr>
<tr>
<td></td>
<td><asp:ButtonValidationGroup="ExistingUsers"
Text="LogIn"RunAt="server"/></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>

<scriptlanguage="C#"runat="server">
voidOnCreateAccount(Objectsender,EventArgse){}
voidOnLogIn(Objectsender,EventArgse){}
</script>

代码9ValidationGroups2.aspx
  跨页面发送

  有关ASP.NET1.x的最多埋怨是只同意页面回发到其自己。在版本2.0中,这一点经由过程引进跨页面发送而失掉改动。要设置跨页面发送,您必要利用招致回发产生的控件的PostBackUrl属性来指定方针页面,如PageOne.aspx中的以下代码所示:

<html>
<body>
<formrunat="server">
<asp:TextBoxID="Input"RunAt="server"/>
<asp:ButtonText="Test"PostBackUrl="PageTwo.aspx"
RunAt="server"
/>
</form>
</body>
</html>
  当被单击时,PageOne.aspx中的按钮将回发到PageTwo.aspx:

<html>
<body>
<asp:LabelID="Output"RunAt="server"/>
</body>
</html>

<scriptlanguage="C#"runat="server">
voidPage_Load(Objectsender,EventArgse)
{
TextBoxinput=(TextBox)PreviousPage.FindControl("Input");
Output.Text="Hello,"+input.Text;
}
</script>
  PageTwo.aspx利用Page类的新PreviousPage属性来猎取对肇端页面的援用。对FindControl的复杂挪用将前往对PageOne.aspx中声明的TextBox的援用,以即可以检索用户的输出。

  默许情形下,System.Web.UI.Page.PreviousPage前往对引发回发的页面的弱范例化援用。可是,假如PageOne.aspx是独一可以向PageTwo.aspx发送的页面,则PageTwo.aspx可使用新的@PreviousPageType指令来猎取对PageOne.aspx的强范例化会见,以下面的代码所示:

<%@PreviousPageTypeTypeName="ASP.PageOne.aspx"%>
...
  小结

  ASP.NET2.0还包括其他我还没有会商的新功效。比方,内置的站点计数器服务使您可以纪录站点利用情形的统计信息,而且在Webadmin.axd中大概在您本人的自界说GUI中检察它们。新的Web组件子体系供应了一个用于构建SharePoint服务器款式流派的框架。

  如今恰是进修ASP.NET2.0的最好机会,由于要在今朝计划可以在未来轻松晋级的系统布局,必要晓得哪些功效行将问世(和哪些功效不会问世)。您的ASP.NET1.x使用程序无需修正就能够在2.0版本上运转,由于Microsoft已承诺新平台将向后兼容旧平台。可是,将来将属于ASP.NET2.0,而这一将来将意味着加倍丰厚的功效和更少的代码。有甚么来由不承受它呢?以前学了大概半年时间的asp(没有机会做大系统,最多是自己对公司系统做些调整和修改还有一些小程序)。应该说开始接触asp.net是今年元月5号的事。现在很想把公司的系统重新用.net来架构,却不知道如何下手。

admin 发表于 2015-1-17 08:09:31

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

分手快乐 发表于 2015-1-20 15:51:43

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

活着的死人 发表于 2015-1-29 12:44:01

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

深爱那片海 发表于 2015-2-6 00:55:01

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

精灵巫婆 发表于 2015-2-14 17:58:46

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

乐观 发表于 2015-3-4 09:39:45

能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。

不帅 发表于 2015-3-11 18:10:45

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

小妖女 发表于 2015-3-19 06:24:10

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

金色的骷髅 发表于 2015-3-27 09:11:04

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
页: [1]
查看完整版本: ASP.NET编程:ASP.NET 2.0的新增服务、控件与功效