在ASP.NET 2.0中操作数据之三:创建母版页和站点导

平面设计 2025-04-05 21:43www.168986.cn平面设计培训

本文主要介绍ASP.NET中创建母版页和使用站点地图的功能。这些工具能够帮助开发者创建统一的站点页面布局和导航体系,从而提升站点的用户友好性和管理效率。

导言

一个优秀的网站不仅要有吸引人的内容,还要有一致的页面设计和布局,以便用户可以轻松找到所需信息。在ASP.NET中,母版页和站点地图是两个非常重要的工具,可以帮助我们实现这一目标。

母版页

母版页是ASP.NET中非常强大的功能,允许开发者创建统一的站点模板,并定义可编辑区域。通过使用母版页,我们可以为整个站点创建一致的页面布局。在母版页中,我们可以添加各种控件、样式和脚本,然后在具体的页面中使用这些母版页,只需要填充指定的可编辑区域即可。这种模式不仅使站点的页面具有统一的设计感和布局,还大大简化了站点的维护和管理。

站点地图

站点地图是另一个非常重要的工具,它允许开发者定义站点的导航结构。通过站点地图,我们可以轻松地管理和呈现站点的所有页面和链接。在ASP.NET中,我们可以使用内置的导航控件(如Menu、TreeView和SiteMapPath)来显示站点地图。这意味着我们可以将站点地图定义在一个XML格式的文件中,然后通过程序查询站点地图信息,轻松地在一个导航用户界面元素中呈现全部或部分站点地图。

创建母版页

为了给我们的站点创建统一的页面布局,我们首先需要创建一个母版页。在解决方案管理器中,右键点击项目名称,选择“添加新项”,然后从模板列表中选择母版类型并命名为“Site.master”。在母版页中,我们可以使用设计视图定义所需的布局和控件,也可以手动添加标记。在我们的示例中,我们使用了外部文件Style.css中的层叠样式表来定义导航用的div标签的位置和样式。这样,我们就可以轻松地创建具有一致设计和布局的站点。

Site.master母板页介绍及操作指南

让我们先来了解一下这个充满活力和魅力的Site.master母板页。作为网站的基础架构,母板页定义了固定的布局和可编辑区域,为网站的各个页面提供了统一的外观和感觉。让我们一起走进这个奇妙的页面设计世界。

当你打开Site.master文件时,你会看到它包含了许多重要的元素和结构。其中,HTML框架定义了页面的基本结构,CSS样式表则为页面注入了活力和美感。母板页的核心功能是通过ContentPlaceHolder控件实现的,这些控件在特定的div标记中定义,允许内容编辑者填充内容。

接下来,我们来谈谈如何给站点添加主页。一旦你定义了母板页,就可以开始为你的网站添加ASPX页面了。让我们从添加首页Default.aspx开始。在解决方案管理器中,右键点击项目名称并选择“添加新项目”。在模板列表中选择Web Form选项并命名为Default.aspx。你会看到一个选项让你选择是否要使用母板页。由于我们已经定义了一个母板页,所以选择它并继续。

点击“确定”后,系统会询问你想为这个新建的ASPX页面使用哪个母板页。由于我们的项目中只有一个母板页,所以选择它即可。完成这些步骤后,Default.aspx页面就会按照Site.master母板页的框架进行布局,同时你可以在MainContent区域填充自己的内容,展示你的独特风格和创意。

图6:选择你的母板页模板

在选择母板页模板后,新建的ASPX页面将自动包含针对网站SEO优化的标记。以下是关于Default.aspx页面的详细解读。

在此页面的@Page指令中,我们引用了一个母板页(MasterPageFile="~/Site.master")。该aspx页面的标记中包含一个Content控件,它与母板页中定义的ContentPlaceHolder控件相匹配。这个Content控件的ContentPlaceHolderID属性与指定的ContentPlaceHolder控件相互映射。你可以在Content控件中放置你想显示在相应ContentPlaceHolder控件位置的标记。

让我们进一步定制这个页面,将@Page指令的Title属性设置为"Home",并在Content控件中添加一些欢迎词。

Default.aspx页面的代码可能如下所示:

<%@ Page Language="C" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Home" %>

欢迎来到数据操作教程网站

本网站是作为一系列教程的一部分而建立的,旨在展示ASP.NET 2.0和Visual Web Developer中的一些新的数据访问和数据绑定功能。 随着时间的推移,我们将包括一系列样本,展示以下内容:

  • 构建数据访问层(DAL)
  • 使用强类型的TableAdapters和DataTables
  • 主细节报告
  • 过滤
  • 分页
  • 双向数据绑定
  • 编辑
  • 删除
  • 分层数据浏览
  • 分层钻取
  • 乐观并发
  • 以及更多!

在这个页面中,@Page指令中的Title属性使我们能够在aspx页面定义标题,即使母板页中已经包含了元素。我们还可以通过编程方式使用Page.Title来设置页面的标题。这样的设置使得网站内容更为丰富,页面结构清晰,用户体验更加友好。母板页中的样式表自动应用于每个aspx页面</p> <p>当我们切换到设计视图时,可以预览页面在浏览器中的效果。设计视图中,只有aspx页面的可编辑区域可以被修改,母板页中定义的非ContentPlaceHolder部分则以灰色显示,无法直接编辑。</p> <p>(图7:设计视图中的可编辑与非可编辑区域)</p> <p>当Default.aspx页面被访问时,ASP.NET引擎会合并母板页和aspx页面的内容,将合并后的内容转化为最终的HTML并发送到浏览器。若母板页内容更新,所有使用该母板页的aspx页面在下次被请求时都会与新的母板页内容重新合并。简而言之,使用母板页模型允许我们定义一个统一的布局模板,当其变化时,整个站点都会反映这种更新。</p> <p>接下来,我们向站点中添加更多页面。为了支持各种类型的课程示例,我们需要添加超过35个页面。为了更好地管理这些页面,我们为每个分类创建一个文件夹,如BasicReporting、Filtering和CustomFormatting等。(图8:添加新文件)</p> <p>在添加每个文件时,都需要选择母板页。</p> <p>管理大量网页的站点的挑战之一是提供便捷的导航路径给访问者。我们需要定义站点的导航结构,并将其转化为用户界面元素,如菜单或位置导航。在ASP.NET 2.0之前,开发者需要自己创建和维护站点导航结构。但现在,我们可以利用ASP.NET 2.0内置的灵活站点导航系统。</p> <p>这个系统允许我们定义一个站点地图,并提供API来访问这些信息。默认的ASP.NET站点地图提供者期望站点地图信息以XML格式存储。虽然站点导航系统可以扩展以支持多种存储方式,但在本指南中,我们将使用ASP.NET 2.0中的默认站点地图提供者。</p> <p>(图9:向项目中添加站点地图)</p> <p>站点地图文件是一个XML文件,Visual Studio为其提供智能感知功能。站点地图文件必须有<siteMap>作为根节点,并且至少包含一个<siteMapNode>子节点。这些<siteMapNode>元素可以包含任意数量的子元素,模拟站点的文件系统结构。这样构建的站点地图为访问者提供了一个清晰的浏览路径,同时也方便了开发者对站点的管理和维护。为每一个文件夹和aspx页面注入站点地图生命力</p> <p>在Web开发中,站点地图(sitemap)是一个至关重要的组成部分,它定义了站点的导航结构,清晰地展示了站点的层次结构,帮助用户快速找到他们想要访问的区域。此刻,我们要为每个文件夹添加一个<siteMapNode>元素,并且为每个aspx页面添加一个<siteMapNode>子元素。</p> <p>让我们以XML格式来描绘这个站点地图:</p> <p>```xml</p> <p><?xml version="1.0" encoding="utf-8"?></p> <p><siteMap xmlns=" <p><!-- 主节点,定义了网站的入口点 --></p> <p><siteMapNode url="~/Default.aspx" title="Home" description="欢迎来到我们的网站主页"></p> <p><!-- Basic Reporting节点及其子节点 --></p> <p><siteMapNode title="基础报告" url="~/BasicReporting/Default.aspx" description="基础报告示例"></p> <p><siteMapNode url="~/BasicReporting/SimpleDisplay.aspx" title="简单显示" description="显示数据库表的所有内容"/></p> <p><siteMapNode url="~/BasicReporting/DeclarativeParams.aspx" title="声明式参数" description="使用参数显示数据库表的子集"/></p> <p><siteMapNode url="~/BasicReporting/ProgrammaticParams.aspx" title="设置参数值" description="展示如何编程设置参数值"/></p> <p></siteMapNode></p> <p><!-- Filtering Reports节点及其子节点 --></p> <p><siteMapNode title="报告过滤" url="~/Filtering/Default.aspx" description="支持过滤的报告示例"></p> <p><siteMapNode url="~/Filtering/FilterByDropDownList.aspx" title="通过下拉列表过滤" description="使用下拉列表过滤结果"/></p> <p><siteMapNode url="~/Filtering/MasterDetailsDetails.aspx" title="主细节-细节" description="过滤两级的细节结果"/></p> <p><siteMapNode url="~/Filtering/DetailsBySelecting.aspx" title="选定行的细节" description="为选中的项目在网格视图中显示细节结果"/></p> <p></siteMapNode></p> <p><!-- Customized Formatting节点及其子节点 --></p> <p><siteMapNode title="自定义格式" url="~/CustomFormatting/Default.aspx" description="格式自定义的报告示例"></p> <p><siteMapNode url="~/CustomFormatting/CustomColors.aspx" title="格式颜色" description="根据底层数据自定义网格颜色"/></p> <p><siteMapNode url="~/CustomFormatting/GridViewTemplateField.aspx" title="GridView中的自定义内容" description="使用TemplateField自定义GridView中的内容"/></p> <p><siteMapNode url="~/CustomFormatting/DetailsViewTemplateField.aspx" title="DetailsView中的自定义内容" description="使用TemplateField自定义DetailsView中的内容"/></p> <p><siteMapNode url="~/CustomFormatting/FormView.aspx" title="表单视图中的自定义内容" description="使用FormView进行高度自定义的视图展示"/></p> <p><siteMapNode url="~/CustomFormatting/SummaryDataInFooter.aspx" title="页脚中的汇总数据" description="在网格的页脚中显示汇总数据"/></p> <p></siteMapNode></p> <p><!-- 可以继续添加其他节点和子节点... --></p> <p></siteMapNode></p> <p></siteMap></p> <p>```</p> <p>在Web开发中,站点地图(sitemap)扮演着至关重要的角色,它描述了一个站点的层次导航结构。《图10:站点地图揭示层次导航结构》为我们展示了这一概念的生动示例。</p> <p>在ASP.NET框架中,SiteMap类为核心功能提供了强大的支持。这个类具有CurrentNode属性,能够实时反馈当前用户正在访问的节点信息;而RootNode属性则指向站点地图的根节点,也就是我们网站的“家”(Home)。SiteMapNode是核心载体,包含ParentNode、ChildNodes、NextSibling、PreviousSibling等属性,这些属性构建了一个完整的站点地图层次结构,并允许我们遍历整个结构。</p> <p>在ASP.NET 2.0中,展示站点地图数据的方式更加多样和灵活。除了传统的编程方式,我们还可以利用新的数据源控件来访问数据。这其中,SqlDataSource控件用于访问关系数据库,ObjectDataSource控件则用于访问类提供的数据。我们还可以创建自定义的数据源控件,以满足特定需求。</p> <p>数据源控件在ASP.NET页面中扮演着与底层数据交互的重要角色。为了展示数据源控件检索的数据,我们需要在页面上添加Web控件,并将其绑定到相应的数据源控件。绑定过程非常简单,只需设置Web控件的DataSourceID属性,使其与数据源控件的ID相匹配即可。</p> <p>ASP.NET提供了SiteMapDataSource控件,专门用于获取站点地图数据。这个控件可以绑定到Web控件上,以展示站点的导航结构。TreeView和Menu是两个常用的Web控件,它们通常用于提供导航的用户界面。通过添加SiteMapDataSource控件到页面,并设置TreeView或Menu控件的DataSourceID属性,我们就可以轻松地将站点地图数据集成到页面中。</p> <p>在SEO优化的实践中,我们常常将Menu控件集成到母板页中。例如,在狼蚁网站的SEO优化实践中,我们可以使用如下代码将Menu控件与SiteMapDataSource控件结合:</p> <p>在div标签内,我们添加了Menu控件和SiteMapDataSource控件的定义。SiteMapDataSource控件每次返回站点地图中的一级节点,从根节点(Home)开始,然后展示其子节点(如Basic Reporting、Filtering Reports和Customized Formatting等)。</p> <p>通过绑定SiteMapDataSource控件到Repeater控件,我们可以生成优化的HTML代码。在示例中,我们展示了如何将站点地图数据与HyperLink控件结合,生成一个导航菜单。每个菜单项都对应站点地图中的一个节点,用户点击菜单项时,将被导航到对应的页面。</p> <p>ASP.NET的SiteMap类和SiteMapDataSource控件为我们提供了强大的工具,用于管理和展示站点的导航结构。通过灵活使用这些工具,我们可以创建出吸引人的网站导航,提升用户体验。在构建网站时,SiteMapDataSource与Repeater控件的完美结合为我们呈现了一个直观、动态的导航结构。当SiteMapDataSource绑定到Repeater时,它首先遍历站点地图的第一级节点,并在ItemTemplate中展示每一个SiteMapNode实例。每个节点的详细信息,如Url和Title属性,可以通过Eval函数轻松获取,并赋予HyperLink控件。</p> <p>让我们以一个具体的例子来揭示这一过程。假设我们的网站有三级导航结构,而SiteMapDataSource被设置为仅显示第二级节点。这样的设置使得“狼蚁网站SEO优化”的导航结构呈现出如下的HTML标记:</p> <p>```html</p> <p><ul></p> <p><li><a href="/Code/BasicReporting/Default.aspx">基础报表</a></li></p> <p><li><a href="/Code/Filtering/Default.aspx">过滤报告</a></li></p> <p><li><a href="/Code/CustomFormatting/Default.aspx">自定义格式</a></li></p> <p><!-- 其他第二级节点 --></p> <p></ul></p> <p>```</p> <p>从上述HTML代码中可以看出,显示的是站点地图的第二级节点,如“基础报表”、“过滤报告”和“自定义格式”,而非第一级节点。</p> <p>这种变化是由于SiteMapDataSource控件的ShowStartingNode属性被设置为false。当此属性设为false时,SiteMapDataSource将跳过站点地图的根节点(第一级),而从第二级开始返回信息。若想在第二级节点下展示子节点(如Basic Reporting的子SiteMapNode),我们可以在最初的Repeater的ItemTemplate内再嵌套一个Repeater控件。这样,每个第二级节点下都会有一个子级的Repeater来展示其下的子节点,从而形成一个丰富的、多层次的导航结构。</p> <p>使用两个Repeater和CSS构建动态网站菜单</p> <p>在Web开发中,构建一个动态菜单是常见的需求。通过使用ASP.NET的Repeater控件和CSS样式,我们可以轻松地实现这一需求。本文将介绍如何使用两个Repeater控件和一些CSS样式来创建一个动态菜单。</p> <p>我们需要在ASP.NET页面中添加一个Repeater控件,并将其绑定到SiteMapDataSource。这个Repeater控件将用于显示站点地图中的顶层节点。在每个顶层节点中,我们再嵌套另一个Repeater控件,用于显示子节点。</p> <p>以下是示例代码:</p> <p>```asp</p> <p><asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1"></p> <p><ItemTemplate></p> <p><li></p> <p><asp:HyperLink runat="server" NavigateUrl='<% Eval("Url") %>'></p> <p><% Eval("Title") %></p> <p></asp:HyperLink></p> <p><asp:Repeater runat="server" DataSource='<% ((SiteMapNode)Container.DataItem).ChildNodes %>'></p> <p><HeaderTemplate></p> <p><ul></p> <p></HeaderTemplate></p> <p><ItemTemplate></p> <p><li></p> <p><asp:HyperLink runat="server" NavigateUrl='<% Eval("Url") %>'></p> <p><% Eval("Title") %></p> <p></asp:HyperLink></p> <p></li></p> <p></ItemTemplate></p> <p><FooterTemplate></p> <p></ul></p> <p></FooterTemplate></p> <p></asp:Repeater></p> <p></li></p> <p></ItemTemplate></p> <p></asp:Repeater></p> <p>```</p> <p>接下来,我们将生成的HTML标记与CSS样式结合,以呈现最终的菜单样式。我们选择的CSS风格来自Rachel Andrew的著作《The CSS Anthology: 101 Essential Tips, Tricks, & Hacks》。</p> <p>以下是示例HTML和CSS代码:</p> <p>```html</p> <p><li></p> <p><a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a></p> <p><ul></p> <p><li><a href="/Code/BasicReporting/SimpleDisplay.aspx">Simple Display</a></li></p> <p><li><a href="/Code/BasicReporting/DeclarativeParams.aspx">Declarative Parameters</a></li></p> <p><li><a href="/Code/BasicReporting/ProgrammaticParams.aspx">Setting Parameter Values</a></li></p> <p></ul></p> <p></li></p> <p><li></p> <p><a href="/Code/Filtering/Default.aspx">Filtering Reports</a></p> <p>...</p> <p></li></p> <p><li></p> <p><a href="/Code/CustomFormatting/Default.aspx">Customized Formatting</a></p> <p>...</p> <p></li></p> <p>```</p> <p>对应的CSS样式可以定义如下:</p> <p>```css</p> <p>ul {</p> <p>/ 样式定义 /</p> <p>}</p> <p>li {</p> <p>/ 样式定义 /</p> <p>}</p> <p>a {</p> <p>/ 样式定义 /</p> <p>}</p> <p>```</p> <p>这个菜单是在母板页中定义的,并且绑定了在Web.sitemap中定义的站点地图。这意味着对站点地图的任何修改都会立即反映在所有使用了Site.master母板页的页面中。为了优化性能,我们还可以关闭视图状态,以减少生成的HTML大小和提高页面加载速度。</p> <p>利用ViewState记忆Web控件状态,并在页面返回时保持数据绑定</p> <p>在Web开发中,控件的状态管理至关重要。ViewState作为一种机制,能够在页面返回时记忆并恢复控件的状态,例如绑定的数据。虽然它为数据保持提供了便利,但也会增加发送到客户端的HTML代码量。特别是在数据显示控件,如GridView中,额外的标记可能会显著增多。</p> <p>对于宽带用户而言,这种增长可能毫无影响,但对于拨号上网的用户,视图状态可能会增加几秒的延迟。要深入理解视图状态的影响,可以打开浏览器查看页面的源代码,并开启页面跟踪观察每个控件的视图状态。视图状态信息被序列化后,存放在_VIEWSTATE隐藏表单域中,位于<form>标签后的<div>元素里。</p> <p>值得注意的是,视图状态仅在包含<form runat="server">的ASPX页面上启用。若无此声明,生成的HTML标记中不含VIEWSTATE隐藏表单域。母板页产生的VIEWSTATE隐藏表单域大约占用1800个字节,这主要源于SiteMapDataSource控件为Repeater控件提供的数据内容。尽管这个数值看起来可能不大,但当使用GridView并绑定大量字段和记录时,视图状态很容易膨胀10倍或更多。</p> <p>为了减少生成的标记大小,可以关闭视图状态,将EnableViewState属性设置为false。Web控件利用视图状态在页面返回时保持数据绑定。当关闭数据显示控件的视图状态时,每次页面返回时都需要重新绑定数据。在ASP.NET的不同版本中,这一职责的落实有所不同。在ASP.NET 2.0中,当页面返回时,数据显示控件会在必要时自动重新绑定数据。</p> <p>为了减少页面的视图状态,可以设置Repeater控件的EnableViewState为false。这一操作可以通过属性窗口进行,或在代码视图中手动修改。修改后,Repeater标记将类似如下:</p> <p><asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1" EnableViewState="False"> <ItemTemplate> ... <i>此处省略ItemTemplate内容...</i> </ItemTemplate> </asp:Repeater></p> <p>经过这样的调整,页面产生的视图状态减少到52个字节,减少了97%的视图状态数据!在后续的指南中,我会关闭所有数据控件的视图状态以减小标记大小。在大多数情况下,我们会默认将EnableViewState属性设为false。仅在数据Web控件必须开启视图状态以提供所需功能时,我们才会进行讨论。</p> <p>接下来,让我们为母板页添加breadcrumb导航。这一功能可以快速显示用户在站点中的位置。添加breadcrumb导航非常简单——只需在页面上添加一个SiteMapPath控件即可。在我们的站点中,将这个控件添加到头部的<div>标签内。</p> <p>为每个部分添加默认页面。在我们的站点中,课程被分类为基本报告、过滤、自定义格式化等。每个分类都有一个文件夹和对应的ASPX页面,每个文件夹中还包含一个Default.aspx页面。通过合理地使用ViewState和添加导航元素,我们可以创建出功能丰富、用户体验优化的Web应用程序。在这个页面,我们展示了所有课程的内容,这些内容被有序地组织在不同的文件夹下。比如,通过访问Default.aspx页面,我们能够链接到多个不同的页面,如SimpleDisplay.aspx、DeclarativeParams.aspx和ProgrammaticParams.aspx等,它们都在BasicReporting文件夹内。这种结构展示了我们在Web应用中如何使用站点地图导航。</p> <p>我们的站点地图信息被定义在Web.sitemap文件中,通过SiteMap类,我们可以轻松地在网页上显示这些信息。为了生动展示指南的标题和描述,我们决定使用Repeater控件来生成一个无序列表。这个控件将在每个Default.aspx页面上重复展示这些标记和代码。为了简化UI逻辑,我们可以将这些元素封装成一个User Control。</p> <p>在站点的设计中,我们创建了一个名为UserControls的文件夹。在这个文件夹里,我们添加了一个新的Web用户控件,名为SectionLevelTutorialListing.ascx。这个控件包含了以下标记(如图13所示):</p> <p>图13:在UserControls文件夹中添加新的Web用户控件</p> <p>SectionLevelTutorialListing.ascx文件的内容如下:</p> <p>```aspx</p> <p><%@ Control Language="C" AutoEventWireup="true" CodeBehind="SectionLevelTutorialListing.ascx.cs" Inherits="UserControls_SectionLevelTutorialListing" %></p> <p><asp:Repeater ID="TutorialList" runat="server" EnableViewState="False"></p> <p><HeaderTemplate><ul></HeaderTemplate></p> <p><ItemTemplate></p> <p><li><asp:HyperLink runat="server" NavigateUrl='<% Eval("Url") %>' Text='<% Eval("Title") %>'></asp:HyperLink> - <% Eval("Description") %></li></p> <p></ItemTemplate></p> <p><FooterTemplate></ul></FooterTemplate></p> <p></asp:Repeater></p> <p>```</p> <p>我们有对应的代码文件SectionLevelTutorialListing.ascx.cs,它包含了用户控件的后端代码:</p> <p>```csharp</p> <p>using System;</p> <p>using System.Data;</p> <p>using System.Configuration;</p> <p>using System.Web;</p> <p>using System.Web.UI;</p> <p>using System.Web.UI.WebControls;</p> <p>using System.Web.SiteMap; //引入站点地图命名空间</p> <p>public partial class UserControls_SectionLevelTutorialListing : UserControl</p> <p>{</p> <p>protected void Page_Load(object sender, EventArgs e)</p> <p>{</p> <p>// 如果站点地图当前节点不为空,将其子节点绑定到GridView上</p> <p>if (SiteMap.CurrentNode != null)</p> <p>{</p> <p>TutorialList.DataSource = SiteMap.CurrentNode.ChildNodes; // 使用子节点作为数据源</p> <p>TutorialList.DataBind(); // 数据绑定</p> <p>}</p> <p>}</p> <p>}</p> <p>```</p> <p>在Web开发的世界里,用户控件是一种强大的工具,能够为我们提供一致的页面布局和导航体验。想象一下,如果我们使用了这个用户控件,那么对应的SiteMapNode和SiteMap.CurrentNode将会呈现出流畅的数据绑定,填充到Repeater控件中。假设我们手头有一个CurrentNode,那么它的ChildNodes集合可以被轻松地绑定到这个Repeater控件上。每一个部分的Default.aspx页面就是这个部分内教程的父节点,通过代码展示,我们可以清晰地看到每个部分内教程的连接和描述。以狼蚁网站的SEO优化为例,通过屏幕截图展示其具体的操作流程。一旦这个Repeater控件被创建完成,只需在设计视图里打开每个文件夹的Default.aspx页面,将这个用户控件拖放到你想要展示的位置即可。</p> <p>如图14所示,用户控件已经成功添加到Default.aspx页面上。紧接着,在Basic Reporting指南的列表(如图15所示)中,你可以清晰地看到通过GridView、DetailsView和FormView等控件来展示从业务逻辑层获取的数据。通过这一系列的步骤,我们的教程站点已经拥有了统一的页面布局和导航体系。即便站点拥有众多页面,我们也能集中更新站点页面布局和导航信息。值得一提的是,页面布局信息是在母板页Site.master中定义的,而站点地图则定义在Web.sitemap文件中。这一切都不需要编写任何代码,Visual Studio为我们提供了强大的设计时支持。</p> <p>接下来的旅程将通用报表模式。在接下来的三个指南里,我们将深入了解如何使用GridView、DetailsView和FormView等控件来显示从业务逻辑层获取的数据。在这个过程中,我们将逐步掌握如何在报表任务中运用这些控件的技巧和方法。无论你是初学者还是经验丰富的开发者,这些指南都将为你带来宝贵的经验和启示。让我们一起迎接编程的挑战,享受编程的快乐!</p> <p>不得不提的是本文的作者——Scott Mitchell。作为ASP/ASP.NET领域的知名专家,Scott Mitchell著有六本关于此方面的书籍,是4GuysFromRolla.的创始人。自1998年以来,他一直致力于应用微软Web技术。作为一名独立的技术咨询顾问、培训师和作家,Scott最近完成了由Sams出版社的新作《24小时内精通ASP.NET 2.0》。想要联系到他吗?你可以通过他的博客或者电子邮件与他取得联系。让我们共同期待在编程的道路上不断前行!关于页面的具体内容渲染部分,可以通过调用cambrian的render函数来呈现整个页面的主体内容。</p> </div> <script>cambrian.render('body')</script> <small ifdisplay dropzone='uehpam'></small><time ifdisplay lang='ludn20'></time><time ifdisplay date-time='hgxmtb'></time><div class="XsKbjEpZlOacHjC imoney"> </div> <map ifdisplay id='sy8oai'></map><area ifdisplay id='sckrxn'></area><time ifdisplay id='lqnwo2'></time><div class="3UGPfIZpqSUA8fn nextlog"> 上一篇:<a href='/pingmiansheji/680443.html'>vue2.0+ 从插件开发到npm发布的示例代码</a> 下一篇:没有了 </div> <ins ifdisplay dir='8162kk'></ins><bdo ifdisplay lang='24w0ii'></bdo><embed ifdisplay name='7v6jww'></embed><div class="Hp8HuEQNKtanQNP link-box"> <h3>平面设计师</h3> <ul class="R971CnewruWSiRc ullist4"> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680455.html" title="在ASP.NET 2.0中操作数据之三:创建母版页和站点导">在ASP.NET 2.0中操作数据之三:创建母版页和站点导</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680443.html" title="vue2.0+ 从插件开发到npm发布的示例代码">vue2.0+ 从插件开发到npm发布的示例代码</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680441.html" title="javascript实现textarea中tab键的缩排处理方法">javascript实现textarea中tab键的缩排处理方法</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680433.html" title="JS写XSS cookie stealer来窃取密码的步骤详解">JS写XSS cookie stealer来窃取密码的步骤详解</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680404.html" title="javascript制作2048游戏">javascript制作2048游戏</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680399.html" title="知否大结局剧情如何收尾 主角命运如何">知否大结局剧情如何收尾 主角命运如何</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680397.html" title="php自定义加密与解密程序实例">php自定义加密与解密程序实例</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680388.html" title="Delphi - Indy idMessage和idSMTP实现邮件的发送">Delphi - Indy idMessage和idSMTP实现邮件的发送</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680383.html" title="使用Angular CLI进行Build(构建)和Serve详解">使用Angular CLI进行Build(构建)和Serve详解</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680379.html" title="你掀起波澜抛弃了我 (2)">你掀起波澜抛弃了我 (2)</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680358.html" title="ADO.NET通用数据库访问类">ADO.NET通用数据库访问类</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680340.html" title="php封装的smartyBC类完整实例">php封装的smartyBC类完整实例</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680321.html" title="vue使用iframe嵌入网页的示例代码">vue使用iframe嵌入网页的示例代码</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680320.html" title="微信小程序开发之toast等弹框提示使用教程">微信小程序开发之toast等弹框提示使用教程</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680300.html" title="周杰伦的琴伤如何触动人心弦">周杰伦的琴伤如何触动人心弦</a></li> <li><i class="PEBC1xUq4Db5lQU fa fa-caret-right"></i><a href="/pingmiansheji/680296.html" title="幸福到万家罗晋是男主吗">幸福到万家罗晋是男主吗</a></li> </ul> </div> <bdo ifdisplay name='s60v01'></bdo><bdo ifdisplay dir='4247ho'></bdo><sup ifdisplay dropzone='8o7rof'></sup><div id="pagenavi"> </div> </div> </div> <ul id="sidebar"> <li class="9OpYgGq15E3RQON diyarea"> <script src='/plus/ad_js.php?aid=3' language='javascript'></script> </li> <li class="AhtGKx2y4FCcBx2 rlist1"> <h3><span>狼蚁网络搜索</span></h3> <small ifdisplay lang='ssdve2'></small><area ifdisplay id='brjoll'></area><embed ifdisplay id='iry7en'></embed><div id="logsearch"> <form name="keyform" method="get" action="/plus/search.php"> <input type="hidden" name="pagesize" value="20"> <input name="q" class="LAft5Y34RIRLjUD search" type="text" /> <i class="bLDeKrGZ5iDfE0r fa fa-search" onclick="$('form').submit()"></i> </form> </div> </li> <li id="blogsort"> <h3 class="dD8ftcXBDjIEXG5 mcolor"><i class="JRFkmADvmIPGWlK fa fa-folder-open-o"></i><span>狼蚁网络导航</span></h3> </li> <li class="HxXUglFG1ItSCpt rlist1"> <h3><span>长沙seo优化</span></h3> <ul id="newlog"> <li><a href="/pingmiansheji/680455.html">在ASP.NET 2.0中操作数据之三:创建母版页和站点导</a></li> <li><a href="/pingmiansheji/680443.html">vue2.0+ 从插件开发到npm发布的示例代码</a></li> <li><a href="/pingmiansheji/680441.html">javascript实现textarea中tab键的缩排处理方法</a></li> <li><a href="/pingmiansheji/680433.html">JS写XSS cookie stealer来窃取密码的步骤详解</a></li> <li><a href="/pingmiansheji/680404.html">javascript制作2048游戏</a></li> </ul> </li> <li class="6QyKxg150j8wNef rlist1"> <h3><span>长沙网络营销</span></h3> <ul id="hotlog"> <li><i class='zPPtNFVguO3b3W2 mcolor' >1</i><a href="/pingmiansheji/81358.html">cad沉孔符号怎么打? CAD孔深符号的输入技巧</a></li> <li><i class='zPPtNFVguO3b3W2 mcolor' >2</i><a href="/pingmiansheji/100126.html">摄影技巧:教你如何调整快门时间</a></li> <li><i class='zPPtNFVguO3b3W2 mcolor' >3</i><a href="/pingmiansheji/84207.html">cad怎么绘制标准的A3图框? cad做a3图框的教程</a></li> <li><i >4</i><a href="/pingmiansheji/246549.html">ps新手入门基础图解</a></li> <li><i >5</i><a href="/pingmiansheji/480174.html">ps教程:ps教程新手入门教程</a></li> </ul> </li> <li class="Chz2mZKoB8SoTaK rlist1"> <h3><span>长沙网站建设</span></h3> <ul id="randlog"> <div id='tagb2bb7506280e717bcecbca7ab39fc566'> <li><a href="/pingmiansheji/591413.html">征兵宣传标语</a></li> <li><a href="/pingmiansheji/525879.html">Maya Nurbs 建模命令制作汽车轮胎</a></li> <li><a href="/pingmiansheji/82831.html">CAD怎么打开文件? cad文件打开的两种方法</a></li> <li><a href="/pingmiansheji/595529.html">吃螃蟹可以喝牛奶吗</a></li> <li><a href="/pingmiansheji/531420.html">ai怎么画一条鱼- ai画黄金鱼矢量图的教程</a></li> </div> </ul> </li> </ul> </div> </div> <time ifdisplay date-time='229j8o'></time><area ifdisplay dropzone='b70dcz'></area><dfn ifdisplay date-time='wdmkjg'></dfn><div id="footerbar"> <ins ifdisplay lang='rr6lyu'></ins><map ifdisplay date-time='1xp1q4'></map><map ifdisplay dropzone='f8c5a3'></map><div class="XBblG90YIvwSqZr wrap"> <p>Copyright © 2016-2025 www.168986.cn <a href="http://www.168986.cn/" target="_blank">狼蚁网络</a> 版权所有 Power by </p> </div> <embed ifdisplay lang='c0q1wg'></embed><var ifdisplay dir='2s7aic'></var><time ifdisplay lang='dhg4qo'></time><div id="backtop"><span class="yFrWxgTnymYJwF7 fa fa-space-shuttle fa-rotate-270"></span></div> </body> </html>