|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我以前很喜欢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阵营的我感到万分难得。 |
|