![]() |
|
| 1<%@MasterLanguage="C#"AutoEventWireup="true"CodeFile="Site.master.cs"Inherits="Site"%> 2 3<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 5<htmlxmlns="http://www.w3.org/1999/xhtml"> 6<headrunat="server"> 7<title>WorkingwithDataTutorials</title> 8<linkhref="Styles.css"rel="stylesheet"type="text/css"/> 9</head> 10<body> 11<divid="wrapper"> 12 13<formid="form1"runat="server"> 14 15<divid="header"> 16<spanclass="title">WorkingwithDataTutorials</span> 17<spanclass="breadcrumb"> 18TODO:Breadcrumbwillgohere</span> 19</div> 20 21<divid="content"> 22<asp:contentplaceholderid="MainContent" 23runat="server"> 24<!--Page-specificcontentwillgohere--> 25</asp:contentplaceholder> 26</div> 27 28<divid="navigation"> 29TODO:Menuwillgohere 30</div> 31</form> 32</div> 33</body> 34</html> |
一个母板页定义了固定的布局和可以被那些使用了母板页的aspx页面填充的可编辑区域,这个可编辑区域是通过ContentPlaceHolder控件显示,位于<div>标记中。我们的母板页中只有一个ContentPlaceHolder(MainContent),但是母板页中是可以包含多个ContentPlaceHolder控件的。
输入上面的标记,切换到设计视图观察母板页的布局。所有的使用了这个母板页的aspx页面都会有这样统一的布局,而MainContent区域是留给aspx页面展现自己才华的地方。
图4:在设计视图中显示的母板页
步骤2:给站点添加一个主页
定义母板页后,我们准备给站点添加一些aspx页面。让我们从添加我们的首页Degault.aspx开始吧。在解决方案管理器中右键点击项目名称并且选择添加新建项目。从模板列表中选择Web Form选项并且命名为Default.aspx。并且,勾上“选择母板页”的复选框。
图5:添加一个新Web Form并且勾上“选择母板页”的复选框
点击确定按钮后,将会询问你新建的这个aspx页面使用哪个母板页。也许你有多个母板页在你的项目中,但是我们只有一个。
被过滤的广告
图6:选择你要使用的母板页
选择母板页后,新建的aspx会包含下面这些标记:
Default.aspx
| 1<%@PageLanguage="C#"MasterPageFile="~/Site.master"AutoEventWireup="true" CodeFile="Default.aspx.cs"Inherits="_Default"Title="UntitledPage"%> 2<asp:ContentID="Content1"ContentPlaceHolderID="MainContent" 3Runat="Server"> 4</asp:Content> |
| 1<%@PageLanguage="C#"MasterPageFile="~/Site.master"AutoEventWireup="true" CodeFile="Default.aspx.cs"Inherits="_Default"Title="Home"%> 2<asp:ContentID="Content1"ContentPlaceHolderID="MainContent" 3Runat="Server"> 4<h1>WelcometotheWorkingwithDataTutorialSite</h1> 5 6<p>Thissiteisbeingbuiltaspartofasetoftutorialsthat 7illustratesomeofthenewdataaccessanddatabindingfeaturesin 8ASP.NET2.0andVisualWebDeveloper.</p> 9 10<p>Overtime,itwillincludeahostofsamplesthat 11demonstrate:</p> 12 13<ul> 14<li>BuildingaDAL(dataaccesslayer),</li> 15<li>UsingstronglytypedTableAdaptersandDataTables</li> 16<li>Master-Detailreports</li> 17<li>Filtering</li> 18<li>Paging,</li> 19<li>Two-waydatabinding,</li> 20<li>Editing,</li> 21<li>Deleting,</li> 22<li>Inserting,</li> 23<li>Hierarchicaldatabrowsing,</li> 24<li>Hierarchicaldrill-down,</li> 25<li>Optimisticconcurrency,</li> 26<li>Andmore!</li> 27</ul> 28</asp:Content> |
| 1 2<siteMapxmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> 3 4<siteMapNodeurl="~/Default.aspx"title="Home"description="Home"> 5<siteMapNodetitle="BasicReporting" 6url="~/BasicReporting/Default.aspx" 7description="BasicReportingSamples"> 8<siteMapNodeurl="~/BasicReporting/SimpleDisplay.aspx" 9title="SimpleDisplay" 10description="Displaysthecompletecontents 11ofadatabasetable."/> 12<siteMapNodeurl="~/BasicReporting/DeclarativeParams.aspx" 13title="DeclarativeParameters" 14description="Displaysasubsetofthecontents 15ofadatabasetableusingparameters."/> 16<siteMapNodeurl="~/BasicReporting/ProgrammaticParams.aspx" 17title="SettingParameterValues" 18description="Showshowtosetparametervalues 19programmatically."/> 20</siteMapNode> 21 22<siteMapNodetitle="FilteringReports" 23url="~/Filtering/Default.aspx" 24description="SamplesofReportsthatSupportFiltering"> 25<siteMapNodeurl="~/Filtering/FilterByDropDownList.aspx" 26title="FilterbyDrop-DownList" 27description="Filterresultsusingadrop-downlist."/> 28<siteMapNodeurl="~/Filtering/MasterDetailsDetails.aspx" 29title="Master-Details-Details" 30description="Filterresultstwolevelsdown."/> 31<siteMapNodeurl="~/Filtering/DetailsBySelecting.aspx" 32title="DetailsofSelectedRow" 33description="ShowdetailresultsforaselectediteminaGridView."/> 34</siteMapNode> 35 36<siteMapNodetitle="CustomizedFormatting" 37url="~/CustomFormatting/Default.aspx" 38description="SamplesofReportsWhoseFormatsareCustomized"> 39<siteMapNodeurl="~/CustomFormatting/CustomColors.aspx" 40title="FormatColors" 41description="Formatthegrid'scolorsbased 42ontheunderlyingdata."/> 43<siteMapNode 44url="~/CustomFormatting/GridViewTemplateField.aspx" 45title="CustomContentinaGridView" 46description="ShowsusingtheTemplateFieldto 47customizethecontentsofafieldinaGridView."/> 48<siteMapNode 49url="~/CustomFormatting/DetailsViewTemplateField.aspx" 50title="CustomContentinaDetailsView" 51description="ShowsusingtheTemplateFieldtocustomize 52thecontentsofafieldinaDetailsView."/> 53<siteMapNodeurl="~/CustomFormatting/FormView.aspx" 54title="CustomContentinaFormView" 55description="IllustratesusingaFormViewfora 56highlycustomizedview."/> 57<siteMapNodeurl="~/CustomFormatting/SummaryDataInFooter.aspx" 58title="SummaryDatainFooter" 59description="Displaysummarydatainthegridsfooter."/> 60</siteMapNode> 61 62</siteMapNode> 63 64</siteMap> |
| 1<divid="navigation"> 2<asp:MenuID="Menu1"runat="server" 3DataSourceID="SiteMapDataSource1"> 4</asp:Menu> 5 6<asp:SiteMapDataSourceID="SiteMapDataSource1"runat="server"/> 7</div> |
| 1<divid="navigation"> 2<ul> 3<li><asp:HyperLinkrunat="server"ID="lnkHome" 4NavigateUrl="~/Default.aspx">Home</asp:HyperLink></li> 5 6<asp:Repeaterrunat="server"ID="menu" 7DataSourceID="SiteMapDataSource1"> 8<ItemTemplate> 9<li> 10<asp:HyperLinkrunat="server" 11NavigateUrl="<%#Eval("Url")%>"> 12<%#Eval("Title")%> 13</asp:HyperLink> 14</li> 15</ItemTemplate> 16</asp:Repeater> 17</ul> 18 19<asp:SiteMapDataSourceID="SiteMapDataSource1" 20runat="server"ShowStartingNode="false"/> 21</div> |
| 1<li> 2<ahref="/Code/BasicReporting/Default.aspx">BasicReporting</a> 3</li> 4 5<li> 6<ahref="/Code/Filtering/Default.aspx">FilteringReports</a> 7</li> 8 9<li> 10<ahref="/Code/CustomFormatting/Default.aspx"> 11CustomizedFormatting</a> 12</li> |
| 1<asp:Repeaterrunat="server"ID="menu"DataSourceID="SiteMapDataSource1"> 2<ItemTemplate> 3<li> 4<asp:HyperLinkrunat="server" 5NavigateUrl="<%#Eval("Url")%>"> 6<%#Eval("Title")%></asp:HyperLink> 7 8<asp:Repeaterrunat="server" 9DataSource="<%#((SiteMapNode) 10Container.DataItem).ChildNodes%>"> 11<HeaderTemplate> 12<ul> 13</HeaderTemplate> 14 15<ItemTemplate> 16<li> 17<asp:HyperLinkrunat="server" 18NavigateUrl="<%#Eval("Url")%>"> 19<% #Eval("Title")%></asp:HyperLink> 20</li> 21</ItemTemplate> 22 23<FooterTemplate> 24</ul> 25</FooterTemplate> 26</asp:Repeater> 27</li> 28</ItemTemplate> 29</asp:Repeater> |
| 1<li> 2<ahref="/Code/BasicReporting/Default.aspx">BasicReporting</a> 3<ul> 4<li> 5<ahref="/Code/BasicReporting/SimpleDisplay.aspx"> 6SimpleDisplay</a> 7</li> 8<li> 9<ahref="/Code/BasicReporting/DeclarativeParams.aspx"> 10DeclarativeParameters</a> 11</li> 12<li> 13<ahref="/Code/BasicReporting/ProgrammaticParams.aspx"> 14SettingParameterValues</a> 15</li> 16</ul> 17</li> 18 19<li> 20<ahref="/Code/Filtering/Default.aspx">FilteringReports</a> 21 22</li> 23 24<li> 25<ahref="/Code/CustomFormatting/Default.aspx"> 26CustomizedFormatting</a> 27 28</li> |
| 1<asp:Repeaterrunat="server"ID="menu"DataSourceID="SiteMapDataSource1"EnableViewState="False"> 2<ItemTemplate> 3<i>ItemTemplatecontentsomittedforbrevity</i> 4</ItemTemplate> 5</asp:Repeater> |
| 1<spanclass="breadcrumb"> 2<asp:SiteMapPathID="SiteMapPath1"runat="server"> 3</asp:SiteMapPath> 4</span> |
breadcrum导航控件显示了用户当前访问的页面以及它的父级节点,直至到根节点(在我们的站点地图中是Home)。
图12:利用位置导航控件显示在站点地图层次中的当前页面及其父页面
步骤6:给每个部分添加默认页面
在我们的站点中这个课程被分成不同的分类-Basic Reporting,Filtering,Custom Formatting等等-每个分类有一个文件夹并且有对应课程的aspx页面。并且,每个文件夹里包含一个Default.aspx页面。在这个默认页面中,将显示这个部分的所有课程。比如,我们可以通过BasicReporting文件夹里的Default.aspx页面连接到SimpleDisplay.aspx,DeclarativeParams.aspx和ProgrammaticParams.aspx。这里,我们可以再次使用SiteMap类和一个数据显示控件显示定义在Web.sitemap文件内的站点地图的信息。
让我们再次使用Repeater显示一个无序列表,不过这次我们会显示指南的标题和描述。我们需要在每个Default.aspx页面重复这些标记和代码,我们可以将这个UI逻辑封装成一个User Control。在站点中添加一个名为UserControls的文件夹并添加一个名为SectionLevelTutorialListing.ascx的Web用户控件,它包含一下标记:
图13:向UserControls文件夹里添加新Web用户控件
SectionLevelTutorialListing.ascx
| 1<%@ControlLanguage="C#"AutoEventWireup="true"CodeFile="SectionLevelTutorialListing.ascx.cs" Inherits="UserControls_SectionLevelTutorialListing"%> 2<asp:RepeaterID="TutorialList"runat="server"EnableViewState="False"> 3<HeaderTemplate><ul></HeaderTemplate> 4<ItemTemplate> 5<li><asp:HyperLinkrunat="server" 6NavigateUrl="<%#Eval("Url")%>"Text="<%#Eval("Title") 7%>"></asp:HyperLink> 8-<%#Eval("Description")%></li> 9</ItemTemplate> 10<FooterTemplate></ul></FooterTemplate> 11</asp:Repeater> SectionLevelTutorialListing.ascx.cs 1usingSystem; 2usingSystem.Data; 3usingSystem.Configuration; 4usingSystem.Collections; 5usingSystem.Web; 6usingSystem.Web.Security; 7usingSystem.Web.UI; 8usingSystem.Web.UI.WebControls; 9usingSystem.Web.UI.WebControls.WebParts; 10usingSystem.Web.UI.HtmlControls; 11 12publicpartialclassUserControls_SectionLevelTutorialListing:System.Web.UI.UserControl 13{ 14protectedvoidPage_Load(objectsender,EventArgse) 15{ 16//IfSiteMap.CurrentNodeisnotnull, 17//bindCurrentNodeChildNodestotheGridView 18if(SiteMap.CurrentNode!=null) 19{ 20TutorialList.DataSource=SiteMap.CurrentNode.ChildNodes; 21TutorialList.DataBind(); 22} 23} 24} |
在前面的Repeater例子中我将SiteMap的数据绑定到Repeater上;当然,这个SectionLevelTutorialListing用户控件也将使用这种方法。在Page_Load事件里,有一个检测程序以确保这是否是第一次访问该页面(不是返回)并且这个页面的URL要映射到站点地图中的一个节点。如果页面使用了这个用户控件,那么就没有对应的
<siteMapNode>,SiteMap.CurrentNode会返回null并且将没有数据绑定到Repeater控件。假设我们有一个CurrentNode,我可以将它的ChildNodes集合绑定到这个Repeater。每个部分的Default.aspx页面是这个部分内教程的父节点,这些代码会展示每个部分内教程的连接和描述,下面是屏幕截图:
一旦这个Repeater创建好后,在设计视图里打开每个文件夹的Default.aspx页面,将这个用户控件拖到你要显示的地方。
图14:用户控件已经添加到Default.aspx页面上
图15:Basic Reporting指南的列表
总结
完成站点地图和母板页后,现在我们的教程站点拥有统一的页面布局和导航体系。尽管我们的站点有很多页面,但是我们可以集中的更新站点页面布局和站点导航信息。明确一点,页面布局信息在母板页Site.master中定义,站点地图在Web.sitemap中定义。我们不需要写任何代码就完成了站点页面布局和导航机制,Visual Studio提供了所见即所得的设计时支持。
完成了数据访问层和业务逻辑层并且定义了一个统一的页面布局和站点导航系统,下一步我们将探索通用报表模式。在接下来的三个指南里我们将会看到基本报表任务-用GridView,DetailsView和FormView控件显示从业务逻辑层获取的数据。