开发者指南






4.83/5 (4投票s)
开发人员在编写代码或设计不同层时需要注意的事项:表示层:选择您的UI元素
开发者在编写代码或设计不同层时需要注意的事项
表示层
- 仔细选择您的 UI 元素
- 优化 Viewstate
- 状态管理应有效且优化良好
- 良好缓存管理
- 减少与服务器的往返次数
- 有效利用客户端脚本
- 考虑异步调用
- 考虑部分/AJAX 调用来更新页面的一部分
- 对于大型记录集,请考虑分页,如果可能,提供服务器端分页
仔细选择 UI 元素
控件的选择是 ASP.NET 网页性能的重要组成部分。如您所知,页面生命周期和服务器控件生命周期,它必须在执行一些事件后加载,这将花费一些额外的时间来处理和渲染控件。所以请明智地选择您的控件。
首先,我们应该讨论数据控件,它们是任何 Web 应用程序中最常用的控件,用于显示数据集或记录。
ASP.NET 中主要有四种数据控件,它们是
- DataList
- GridView
- ListView 和
- Repeater
拥有这些控件来以自己的方式展示数据记录。每个控件都有其自身的优点和缺点,具体取决于功能。当我们考虑性能时,这些控件的顺序将是 Repeater
、ListView
、DataList
和 GridView
。
Repeater:
Repeater
控件派生自 Control
类。Repeater
仅重复模板中给出的数据。重复的数据通常是 HTML 代码与数据源中的记录混合而成。Repeater
的输出不是预定义的。因此,Repeater
需要最多的工作来定义模板。作为回报,它为我们提供了最大的灵活性来构建布局和优化表示。
对于相同的模板和相同的数据集,Repeater
通常比 DataList
或 GridView
控件工作得更快。这主要是因为 DataReader
类,它用于只读访问。DataReader
比 GridView
常用的 DataSet
或 DataTable
类更快。
与 GridView
和 DataList
控件相比,Repeater
的功能有限。默认情况下,Repeater
适合显示数据。如果您需要编辑数据,它不是最佳选择。此外,默认情况下它不提供记录的分页和排序。
ListView
ListView
控件是 ASP.NET 3.5 中引入的最新数据表示控件。之前的控件(Repeater
、DataList
和 GridView
)在逻辑上是相互关联的。
例如,Repeater
最简单但最快,然后 DataList
功能更多但开销也更大,最后 GridView
最复杂,功能最多,但最重,因此在页面上最慢。
现在,有了新的 ListView
控件,它试图在两个方面提供最佳:速度和设计灵活性,以及许多功能,如分页、记录更新或删除等。因此,ListView
控件通常比 Repeater
或 DataList
更好的选择。
设计的灵活性是有代价的。要使用 ListView
,您可能需要编写大量的标记代码。对于简单的表布局,GridView
需要的工作量要少得多。
ListView
有新的 LayoutTemplate
。与 Header 和 Footer 模板不同,ListView
只有一个 LayoutTemplate
。与 Header 和 Footer 模板相比,LayoutTemplate
的主要优势是它使标记代码看起来更面向对象。所以,这两种模型之间没有太大区别。使用 ListView
上的 LayoutTemplate
可以实现与 Repeater
、DataList
和 GridView
上的 HeaderTemplate
和 FooterTemplate
相同的结果。
DataList
与 Repeater
不同,DataList
控件派生自 WebControl
类。这赋予了它许多样式属性,如 BorderStyle
、BackColor
、ForeColor
等。
DataList
介于 Repeater
和 GridView
之间,在许多方面看起来是这两者的折衷。与 Repeater
相比,DataList
功能更多但在设计上更受限制。另一方面,与 GridView
相比,它具有更多的灵活性和更少的功能。
此外,DataList
具有 RepeatDirection
、RepeatColumns
和 RepeatLayout
属性,这些属性是 DataList
控件独有的。当您需要创建每行多条记录的显示时,例如图片库、产品目录等,这些属性非常有用。
例如,假设您正在创建一个图片库,并希望每行显示 5 张图片。Repeater
需要检查记录位置并操作 HTML。使用 DataList
,只需使用 RepeatDirection="Horizontal"
和 RepeatColumns="5"
。RepeatLayout
可以是 Table 或 Flow,具体取决于您是否需要在布局中使用 HTML 表结构。
GridView
与 DataList
控件一样,GridView
派生自 WebControl
类,并包含许多样式属性。除此之外,GridView
是最复杂的控件,拥有最多的属性。众多功能包括数据分页、排序、记录更新和删除。ASP.NET 的早期版本有 DataGrid
控件。GridView
在 ASP.NET 2.0 中取代了 DataGrid
,成为旧 DataGrid
控件的改进版本。
GridView
以表格形式显示数据。行和列表示为 HTML 表。如果您需要类似网格的显示,这非常有用。如果您需要以表格布局呈现数据,那么 GridView
需要最少的努力。同时,如果您想要更可定制的流式布局,GridView
不是最佳选择。
使用 GridView
控件时的一个常见问题可能是大型 ViewState
,这会导致页面加载变慢并需要更多带宽。这对于流量不大的网站来说可能微不足道,但请记住,页面加载的每一秒,都会有一定比例的访问者不耐烦并离开网站。此外,大量的 view state 对 SEO(搜索引擎优化)不利。
另一个问题是在大型表或高流量网站上使用默认分页器。如果使用默认分页,GridView
将在内存中加载完整的数据集,这会降低网站的性能。
HTML 元素 VS ASP.NET 服务器控件
当比较这两种控件时,HTML 控件的速度非常快。另一方面,服务器控件由于其渲染过程而速度较慢。所有服务器控件在实际页面加载时,都会渲染成普通的 HTML 元素。ASP.NET 渲染引擎必须根据内容应渲染的浏览器渲染服务器控件对应的 HTML 文本。与普通 HTML 元素相比,这是一个额外的过程。
与普通 HTML 元素相比,服务器控件的优势非常高
- 它们具有状态,因此在每次页面回发时,我们可以保留控件的值,并在回发后进行绑定。
- 它们是面向对象的,因此我们可以从代码隐藏处理控件的公共属性。
- 它们提供缓存功能,以便我们可以在页面导航中保留值
- 我们可以将服务器事件附加到服务器控件,而不能直接将它们附加到 HTML 控件。
ViewState 优化
ViewState
是一个隐藏字段,它以 BASE64 格式存储所有其他控件的值,并驻留在同一页面上。ViewState
的范围仅限于页面。ASP.NET 页面中的所有服务器控件都通过 ViewState
维护其状态。
ViewState
的过程非常简单。每当发生页面回发时,所有服务器控件的值及其状态都将保存在 ViewState
中。回发完成后,相应的值将绑定到控件。要理解这个周期,请参阅页面生命周期。
下图说明了相对于每个服务器控件,ViewState
中保存了哪些值
有关 ViewState
优化的更多信息,请单击此处