可重写 Web 部件库





4.00/5 (3投票s)
一个在 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.net 和 UrlRewriting.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
方法注册控件,或在 UpdatePanel
的 Triggers
部分使用声明性 <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 - 初始发布。