在将页面返回给客户端之前更新页面上的所有链接
Update all links on page before returning page to client
概览
我们有一个内部 CMS,最近添加了多语言支持。 CMS 允许 dragging/dropping 各种面板(.net 控件),一些面板显示通过富文本编辑器输入的动态内容。此外,某些字段是多语言的,因此某些面板内容会根据当前语言而变化。
理想情况下,我们希望将语言添加到 URL。所以 /contact-us
变成 /en/contact-us
。
然后我们的主处理程序将设置语言,所有面板将显示相关副本。
目标
因此,理想情况下我们希望能够:
- 在我们的主页面汇编程序(例如在 PreRender 中)构建后处理页面服务器端
- 解析构建的页面或递归控制树以更新所有内部链接
- 为页面上的所有内部链接添加语言代码。 (一旦我们知道它们都在哪里就很容易了)
注意:一些链接将由 .net HyperLink 控件提供,但其他链接将是通过富文本编辑器输入的 <a>
标签。
我看过的东西
我略读了 google,但没有找到似乎符合我们需求的内容:
Html 敏捷包 - 可用于获取 URL 并解析链接。但我猜这不能在我们主页构建器的 Pre_Render 中使用。我想是抓取的理想选择。
各种JS解决方案-定位链接并更新。非常简单,但我对使用 JS 更新 URLs 客户端持谨慎态度。
欢迎所有建议:)
所以,会有动态内容和静态内容。 CMS 用户应该能够编辑它们。你应该有一个语言数据库 table,例如;对于"about us"页,其他table.
页面应该有about-us EN,about-us DE,about-us FR行
您还应该有另一个 table 用于静态内容。例如联系我们表格。联系表格上有静态文本。姓名、电子邮件、消息等
这可以通过覆盖 Page.Render() 来完成,如下所示:
protected override void Render(HtmlTextWriter htmlWriter)
{
StringBuilder ThisSB = new StringBuilder();
StringWriter ThisSW = new StringWriter(ThisSB);
HtmlTextWriter RenderedPage = new HtmlTextWriter(ThisSW);
// pass our writer to base.Render to generate page output
base.Render(RenderedPage);
// get rendered page as a string
string PageResult = ThisSB.ToString();
// modify the page
string ModifiedPage = UpdatePage(PageResult);
// write modified page to client
htmlWriter.Write(ModifiedPage);
}
UpdatePage 方法可以按照您希望的任何方式将页面作为字符串进行操作 - 在我们的例子中,我们使用查找和更新所有链接和本地文件路径。
概览
我们有一个内部 CMS,最近添加了多语言支持。 CMS 允许 dragging/dropping 各种面板(.net 控件),一些面板显示通过富文本编辑器输入的动态内容。此外,某些字段是多语言的,因此某些面板内容会根据当前语言而变化。
理想情况下,我们希望将语言添加到 URL。所以 /contact-us
变成 /en/contact-us
。
然后我们的主处理程序将设置语言,所有面板将显示相关副本。
目标
因此,理想情况下我们希望能够:
- 在我们的主页面汇编程序(例如在 PreRender 中)构建后处理页面服务器端
- 解析构建的页面或递归控制树以更新所有内部链接
- 为页面上的所有内部链接添加语言代码。 (一旦我们知道它们都在哪里就很容易了)
注意:一些链接将由 .net HyperLink 控件提供,但其他链接将是通过富文本编辑器输入的 <a>
标签。
我看过的东西
我略读了 google,但没有找到似乎符合我们需求的内容:
Html 敏捷包 - 可用于获取 URL 并解析链接。但我猜这不能在我们主页构建器的 Pre_Render 中使用。我想是抓取的理想选择。
各种JS解决方案-定位链接并更新。非常简单,但我对使用 JS 更新 URLs 客户端持谨慎态度。
欢迎所有建议:)
所以,会有动态内容和静态内容。 CMS 用户应该能够编辑它们。你应该有一个语言数据库 table,例如;对于"about us"页,其他table.
页面应该有about-us EN,about-us DE,about-us FR行您还应该有另一个 table 用于静态内容。例如联系我们表格。联系表格上有静态文本。姓名、电子邮件、消息等
这可以通过覆盖 Page.Render() 来完成,如下所示:
protected override void Render(HtmlTextWriter htmlWriter)
{
StringBuilder ThisSB = new StringBuilder();
StringWriter ThisSW = new StringWriter(ThisSB);
HtmlTextWriter RenderedPage = new HtmlTextWriter(ThisSW);
// pass our writer to base.Render to generate page output
base.Render(RenderedPage);
// get rendered page as a string
string PageResult = ThisSB.ToString();
// modify the page
string ModifiedPage = UpdatePage(PageResult);
// write modified page to client
htmlWriter.Write(ModifiedPage);
}
UpdatePage 方法可以按照您希望的任何方式将页面作为字符串进行操作 - 在我们的例子中,我们使用查找和更新所有链接和本地文件路径。