仓酷云

标题: ASP.NET网页设计ASP.NET 2.0中完成模板中的数据绑定 [打印本页]

作者: 冷月葬花魂    时间: 2015-1-16 22:45
标题: ASP.NET网页设计ASP.NET 2.0中完成模板中的数据绑定
我以前很喜欢Serv-U,自从它用Java重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。asp.net|模板|数据<P>  模板化的数据绑定控件为我们在页面上显现数据供应了基本的天真性。你大概还记得ASP.NETv1.x中的几个模板化控件(比方DataList和Repeater控件)。ASP.NET2.0仍旧撑持这些控件,但在模板中绑定命据的语法已被简化和改良了。本文将会商在数据绑定控件模板中绑定命据的多种办法。

  数据绑定表达式

  ASP.NET2.0改良了模板中的数据绑定操纵,把v1.x中的数据绑定语法DataBinder.Eval(Container.DataItem,fieldname)简化为Eval(fieldname)。Eval办法与DataBinder.Eval一样能够承受一个可选的格局化字符串参数。延长的Eval语法与DataBinder.Eval的分歧点在于,Eval会依据比来的容器工具(比方DataListItem)的DataItem属性来主动地剖析字段,而DataBinder.Eval必要利用参数来指定容器。因为这个缘故原由,Eval只能在数据绑定控件的模板中利用,而不克不及用于Page(页面)层。固然,ASP.NET2.0页面中仍旧撑持DataBinder.Eval,你能够在不撑持简化的Eval语法的情况中利用它。

  上面的例子演示了怎样利用新的简化的Eval数据绑定语法绑定到DataList数据项模板(ItemTemplate)中的Image、Label和HyperLink控件。

<asp:DataListID="DataList1"RepeatColumns="5"Width="600"runat="server"DataSourceID="ObjectDataSource1">
 <ItemTemplate>
  <asp:HyperLinkID="HyperLink1"runat="server"NavigateUrl=<%#Eval("PhotoID","PhotoFormViewPlain.aspx?ID={0}")%>>
  <asp:ImageID="Image1"Runat="server"ImageUrl=<%#Eval("FileName","images/thumbs/{0}")%>/></asp:HyperLink>
  <asp:LabelID="CaptionLabel"runat="server"Text=<%#Eval("Caption")%>/>
 </ItemTemplate>
</asp:DataList><br/>
<asp:ObjectDataSourceID="ObjectDataSource1"runat="server"TypeName="DataComponentTableAdapters.PhotosTableAdapter"SelectMethod="GetPhotosForAlbum">
  数据绑定也能够作为控件的主题界说(themedefinition)的一部分,如许我们就能够经由过程改动主题来随便地改动模板化控件的结构和表面。可是Theme(主题)模板中只能利用Eval(大概前面会商的Bind)。绑定就任意的用户代码是被克制的。

  FormView控件

  DataList控件在来自数据源的数据项中举行迭代操纵,并为每一个数据项输入ItemTemplate(数据项模板)。这关于显现数据项列表是有效的,可是一般情形下,你但愿在一个窗体中完成单条数据项的绑定操纵。为了完成这个目标,ASP.NET2.0引进了FormView控件,它可以在恣意的模板中每次显现一个数据项。DetailsView和FormView之间的次要差别在于,DetailsView具有内建的表格显现体例,而FormView必要利用用户自界说的显现模板。在别的方面FormView和DetailsView工具模子长短常类似的。上面的例子显现了一个绑定到ObjectDataSource的FormView控件。该FormView的ItemTemplate属性包括数据绑定的Image、Label和HyperLink控件,与后面的DataList示例相似。

<asp:FormViewID="FormView1"runat="server"DataSourceID="ObjectDataSource1">
 <ItemTemplate>
  <asp:LabelID="CaptionLabel"runat="server"Text=<%#Eval("Caption")%>Font-Size="32pt"/><br/>
  <asp:ImageID="Image1"runat="server"ImageUrl=<%#Eval("FileName","images/{0}")%>/>
  <asp:HyperLinkID="HyperLink1"Text="BacktoAlbum"NavigateUrl=<%#Eval("AlbumID","PhotosDataList.aspx?ID={0}")%>runat="server"/>
 </ItemTemplate>
</asp:FormView>
<asp:ObjectDataSourceID="ObjectDataSource1"runat="server"TypeName="DataComponentTableAdapters.PhotosTableAdapter"SelectMethod="GetPhoto">
 <SelectParameters>
<asp:QueryStringParameterName="PhotoID"DefaultValue="9"QueryStringField="ID"/>
</SelectParameters>
</asp:ObjectDataSource>
  FormView与DetailsView相似,也跟踪以后显现的数据项,可是当数据源前往列表的时分,我们也能够选择撑持多个数据项的分页操纵。上面的例子显现了一个带有分页功效的FormView。

<asp:FormViewID="FormView1"Runat="server"DataSourceID="SqlDataSource1"
HeaderText="BooksforAuthor"AllowPaging="True">
 <ItemTemplate>
  <asp:ImageID="Image1"ImageUrl=<%#Eval("title_id","~/Images/{0}.gif")%>Runat="server"/>
  <asp:LabelID="Label1"Font-Size="1.2em"Font-Bold="true"Text=<%#Eval("title")%>runat="server"/>
  <asp:LabelID="Label2"Text=<%#Eval("price","{0:c}")%>runat="server"/>
 </ItemTemplate>
</asp:FormView>
<asp:SqlDataSourceID="SqlDataSource1"Runat="server"SelectCommand="SELECTdbo.authors.au_id,dbo.titles.title_id,dbo.titles.title,dbo.titles.type,dbo.titles.price,dbo.titles.notesFROMdbo.authorsINNERJOINdbo.titleauthorONdbo.authors.au_id=dbo.titleauthor.au_idINNERJOINdbo.titlesONdbo.titleauthor.title_id=dbo.titles.title_idWHERE(dbo.authors.au_id=@au_id)"
ConnectionString="<%$ConnectionStrings:Pubs%>">
<SelectParameters>
<asp:QueryStringParameterName="au_id"DefaultValue="213-46-8915"QueryStringField="ID"/>
</SelectParameters>
</asp:SqlDataSource><P>  双向数据绑定

  FormView能够经由过程相干的数据源控件撑持主动地更新、拔出和删除操纵(与DetailsView相似)。假如要界说编纂或拔出的UI,那末除界说数据项模板(ItemTemplate)以外,你还要界说EditItemTemplate或InsertItemTemplate模板。在这个模板中,你能够把输出控件(比方文本框、反省框或下拉列表)绑定到数据源的字段。这些模板中的数据绑定利用了"双向"数据绑定语法,同意FormView从模板的输出控件中提取值并传送给数据源。这些数据绑定操纵用新的Bind(fieldname)语法取代了Eval。

  请注重:利用Bind语法的数据绑定控件必需设置好ID属性。

  GridView或DetailsView实行更新或拔出操纵的时分(这些控件的Columns或Fields城市界说BoundFields,绑定字段),GridView或DetailsView卖力创建编纂或拔出形式中的输出UI,因而它可以主动地提取这些值并把它们传送给数据源。因为模板包括了恣意的用户自界说UI控件,双向数据绑定语法就是需要的,以确保模板化控件(比方FormView)在应对更新、拔出或删除操纵的时分,晓得应当从模板中提取那些控件的值。你仍旧能够在EditItemTemplate中利用Eval语句举行数据绑定,来给数据源传送值。请注重,FormView与DetailsView和GridView一样撑持DataKeyNames属性,它保留了传送给更新/删除操纵的主键字典的原始值,即便这些值没有显现出来。

  FormView撑持DefaultMode属性,它能够指定默许显现的模板,但在默许情形下FormView处于只读形式并显现ItemTemplate模板。为了把UI从只读形式转换为编纂或拔出形式,你能够给模板增加一个按钮控件,把该按钮的CommandName属性设置为Edit或New。在EditItemTemplate模板中,你能够增添按钮,把CommandName设置为Update或Cancel以提交或停止更新操纵。相似的,你能够增添按钮,把CommandName设置为Insert或Cancel来提交或停止拔出操纵。

  上面的例子演示了界说了ItemTemplate和EditItemTemplate模板的FormView。个中的ItemTemplate模板包括了利用Eval(双向)绑定的控件,而EditItemTemplate模板则包括了利用Bind语句举行双向绑定的文本框控件。主键字段(PhotoID)是利用DataKeyNames属性寄存在viewstate中的。该FormView包括了用于在模板之间举行切换的按钮。

<asp:FormViewID="FormView1"runat="server"DataSourceID="ObjectDataSource1"DataKeyNames="PhotoID">
<EditItemTemplate>
 <b>EnteraNewCaption:</b>
 <asp:TextBoxText=<%#Bind("Caption")%>runat="server"ID="CaptionTextBox"/><asp:ButtonID="Button1"runat="server"Text="Update"CommandName="Update"/>
 <asp:ButtonID="Button2"runat="server"Text="Cancel"CommandName="Cancel"/>
</EditItemTemplate>
<ItemTemplate>
 <asp:LabelID="CaptionLabel"runat="server"Text=<%#Eval("Caption")%>Font-Size="32pt"/><br/>
 <asp:ImageID="Image1"runat="server"ImageUrl=<%#Eval("FileName","images/{0}")%>/><br/>
 <asp:ButtonID="Button3"runat="server"Text="EditCaption..."CommandName="Edit"/><asp:HyperLinkID="HyperLink1"Text="BacktoAlbum"NavigateUrl=<%#Eval("AlbumID","PhotosDataList.aspx?ID={0}")%>runat="server"/>
</ItemTemplate>
</asp:FormView>
<asp:ObjectDataSourceID="ObjectDataSource1"runat="server"TypeName="DataComponentTableAdapters.PhotosTableAdapter"SelectMethod="GetPhoto"UpdateMethod="UpdateCaption"OldValuesParameterFormatString="original_{0}">
 <UpdateParameters>
  <asp:ParameterName="Caption"/>
  <asp:ParameterName="Original_PhotoID"/>
 </UpdateParameters>
<SelectParameters>
<asp:QueryStringParameterName="PhotoID"DefaultValue="9"QueryStringField="ID"/>
</SelectParameters>
</asp:ObjectDataSource>
  GridView和DetailsView还撑持模板化UI,它是经由过程给Columns或Fields汇合增添TemplateField来完成的。TemplateField撑持利用ItemTemplate、EditItemTemplate和InsertItemTemplate(DetailsView才有)为控件的分歧显现形式中的字段指定UI。与下面的FormView示例相似,EditItemTemplate或InsertItemTemplate中的双向数据绑定也同意GridView或DetailsView从这些模板的控件中提取值。TemplateField最多见的用处是给EditItemTemplate增添考证器控件,用于公然地考证GridView或DetailsView操纵。上面的例子演示了这类手艺。





……
<asp:GridViewID="GridView1"runat="server"DataSourceID="ObjectDataSource1"AutoGenerateColumns="False"AllowPaging="True"AllowSorting="True"DataKeyNames="AlbumID">
 <Columns>
  <asp:CommandFieldShowEditButton="True"/>
  <asp:BoundFieldReadOnly="True"HeaderText="AlbumID"DataField="AlbumID"SortExpression="AlbumID"/>
  <asp:TemplateFieldHeaderText="AlbumName"SortExpression="AlbumName"ItemStyle-Wrap="false">
   <ItemTemplate>
    <asp:LabelID="Label1"runat="server"Text=<%#Eval("AlbumName")%>></asp:Label>
   </ItemTemplate>
   <EditItemTemplate>
    <asp:TextBoxID="TextBox1"runat="server"Text=<%#Bind("AlbumName")%>></asp:TextBox>
    <asp:RequiredFieldValidatorControlToValidate="TextBox1"ErrorMessage="AlbumNamecannotbeempty"ID="RequiredFieldValidator1"Display="Dynamic"runat="server">*</asp:RequiredFieldValidator>
   </EditItemTemplate>
  </asp:TemplateField>
  ……
  </asp:GridView><br/>
  <asp:ValidationSummaryID="ValidationSummary1"runat="server"/>
  <asp:ObjectDataSourceID="ObjectDataSource1"runat="server"ConvertNullToDBNull="true"
TypeName="DataComponentTableAdapters.AlbumsTableAdapter"SelectMethod="GetAlbumsByOwner"UpdateMethod="Update"OldValuesParameterFormatString="original_{0}">
  ……
</asp:ObjectDataSource>
  TemplateField的别的一种用处是定制给GridView或DetailsView列/字段输出值的控件。比方,你能够在TemplateField的EditItemTemplate中安排一个DropDownList,同意用户从预界说的值列表当选择。上面的例子演示了这类手艺。请注重,示例中的下拉列表绑定到了本人的数据源控件,以静态地猎取列表值。

<asp:TemplateFieldHeaderText="Owner"SortExpression="Owner">
 <ItemTemplate>
  <asp:LabelID="Label2"runat="server"Text=<%#Eval("Owner")%>></asp:Label>
 </ItemTemplate>
 <EditItemTemplate>
  <asp:DropDownListDataSourceID="ObjectDataSource2"DataTextField="Owner"DataValueField="Owner"ID="DropDownList2"runat="server"SelectedValue=<%#Bind("Owner")%>>
  </asp:DropDownList>
 </EditItemTemplate>
 <ItemStyleWrap="False"/>
</asp:TemplateField>既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。
作者: 爱飞    时间: 2015-1-19 22:46
ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
作者: 若相依    时间: 2015-1-25 14:37
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
作者: 分手快乐    时间: 2015-2-2 22:29
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
作者: 活着的死人    时间: 2015-2-8 15:05
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
作者: 灵魂腐蚀    时间: 2015-2-25 19:23
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 不帅    时间: 2015-3-8 01:37
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
作者: 第二个灵魂    时间: 2015-3-15 19:22
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
作者: 山那边是海    时间: 2015-3-22 03:09
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: 变相怪杰    时间: 2015-3-22 03:09
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2