65.9K
CodeProject 正在变化。 阅读更多。
Home

可重写 Web 部件库

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2008年6月10日

LGPL3

5分钟阅读

viewsIcon

28589

downloadIcon

210

一个在 URL 重写组合使用 ASP.NET 2.0 Web 部件的系统。

引言

当您将 Web 部件与重写后的 URL 结合使用时,所有 Web 部件都将被重写到同一个 ASPX 文件中的所有 URL 所共享。该库通过将 WebPartManager 替换为 RewritableWebPartManager,将 SqlPersonalizationProvider 替换为 RewritableSqlPersonalizationProvider 来纠正此问题。

它还提供了额外的功能,即个性化级别。这允许您在多个 URL 之间共享通用的个性化设置。当用户浏览时,如果在某个特定级别没有指定个性化设置,则会显示上一级别的个性化设置。例如,在网上商店的场景中,您可以允许商店运营商提供所有用户都会看到的共享个性化设置。通过使用级别,他们可以设置出现在所有商品页面上的个性化内容,例如免责声明,然后可以在特定商品的页面上用不同的免责声明覆盖该个性化内容。

背景

Web 部件是一个很棒的新系统,它允许最终用户个性化网站,该系统在 ASP.NET 2.0 中引入。然而,当与 URL 重写结合使用时,它并无用处。

URL 重写允许您通过将处理重定向到服务器上的另一个 ASPX 文件来响应来自动态 URL 的请求。这可以使您的 URL 更具可读性,并提高搜索引擎优化(SEO),而不是使用长的查询参数。一些实现此功能的示例系统是 UrlRewriter.netUrlRewriting.net

使用代码

RewritableSqlPersonalizationProvider

您应该在 web.config 中用此提供程序替换您的 SqlPersonalizationProvider。它会根据原始请求 URL、显示模式和当前选定的个性化级别的组合,智能地加载和存储个性化设置。请注意,它仍然可以被标准的 WebPartManager 使用,而不是 RewritableWebPartManager,在这种情况下,它的行为将与普通的 SqlPersonalizationProvider 完全相同。

基本原理是,如果您正在浏览,它会找到第一个具有任何设置的个性化级别,并在加载时返回这些设置。如果您处于任何其他显示模式,它始终返回当前选定的个性化级别的设置。

显然,此提供程序仅支持标准的 SQL 数据库进行数据存储。但是,您可以根据需要使用此代码继承自任何其他类型的个性化提供程序。

RewritableWebPartManager

使用此而不是 WebPartManager 来启用 RewritableSqlPersonalizationProvider 的功能。它使用 RewritableWebPartPersonalization 类而不是标准的 WebPartPersonalization 类来提供个性化设置。此类可通过 RewritablePersonalization 属性访问,以减少类型转换的需求。

您可以在 ASP.NET 页面中声明性地定义它,如下所示

<rwwpl:RewritableWebPartManager ID="mgr" runat="server">
  <RewritablePersonalization Enabled="true">
    <PersonalizationLevels>
      <rwwpl:PersonalizationLevel LevelID="uniqueid" Description="Description" />
    </PersonalizationLevels>
  </RewritablePersonalization>
</rwwpl:RewritableWebPartManager>

每个级别都必须有一个唯一的 LevelID,该 ID 用于在个性化数据库中标识它。正是这个 LevelID 允许您在多个页面之间共享相同的个性化设置。

个性化级别在从列表的开头向下浏览时使用。首先,它会检查请求的 URL 的个性化设置。如果没有找到,它会向下移动到列表中的第一个级别,然后是第二个,依此类推。

如果从用户控件或内容页面使用此功能,您可以通过调用 RewritableWebPartManager.GetCurrent(page) 来获取当前页面的可重写 Web 部件管理器。如果不存在 Web 部件管理器,或者 Web 部件管理器不可重写,则此调用将返回 Nothing

PersonalizationLevelDropDown

这是一个您可以添加到页面中的辅助控件,允许用户在个性化级别之间切换。请注意,它总是在 PreRender 事件期间重置其内部的个性化级别列表,因此如果您想自定义它,必须在该点之后进行。此外,如果存在 AJAX ScriptManager,它会自动将自己注册为同步回发控件。

关注点

行为差异

当您在 User 和 Shared 范围之间更改时,标准的 WebPartManager 会执行 Server.Transfer 回到最初请求的页面,以强制重新加载个性化数据。RewritableWebPartManager 会执行此操作,但还必须在其他时候执行。具体来说,每当您更改个性化级别,或切换到或从 Browse 显示模式时。在不同的编辑显示模式之间切换不会导致 Server.Transfer

您必须意识到这种差异,因为在这种 Server.Transfer 过程中会丢失任何回发数据。此外,在异步 AJAX 回发期间,Server.Transfer 将不起作用。如果您正在使用 AJAX UpdatePanel,则必须确保任何会导致 Server.Transfer 的回发都是同步执行的。您可以通过使用 ScriptManager.RegisterPostBackControl 方法注册控件,或在 UpdatePanelTriggers 部分使用声明性 <asp:PostBackTrigger> 标签来实现。

动态定义个性化级别

有时,在使用 URL 重写或内容页面时,您可能希望通过代码动态地向页面添加个性化级别。要做到这一点,它们必须在页面初始化之前,在页面的 PreInit 事件期间添加。要做到这一点,请调用 RewritableWebPartManager.RegisterPersonalizationLevel 共享方法。如果您将 insertAtBeginning 传递为 True,则该级别将被插入到列表的开头。否则,它将被添加到列表的末尾。任何以声明方式定义的级别将位于使用 insertAtBeginning 添加的级别和未使用的级别之间。

示例

Private Sub Page_PreInit(sender As Object, e As System.EventArgs)
  RewritableWebPartManager.RegisterPersonalizationLevel(_
      New PersonalizationLevel("AllPages", "All Pages"))
End Sub

历史

  • 1.0.0.0 - 2008/6/10 - 初始发布。
© . All rights reserved.