在将页面返回给客户端之前更新页面上的所有链接

Update all links on page before returning page to client

概览

我们有一个内部 CMS,最近添加了多语言支持。 CMS 允许 dragging/dropping 各种面板(.net 控件),一些面板显示通过富文本编辑器输入的动态内容。此外,某些字段是多语言的,因此某些面板内容会根据当前语言而变化。 理想情况下,我们希望将语言添加到 URL。所以 /contact-us 变成 /en/contact-us。 然后我们的主处理程序将设置语言,所有面板将显示相关副本。

目标

因此,理想情况下我们希望能够:

  1. 在我们的主页面汇编程序(例如在 PreRender 中)构建后处理页面服务器端
  2. 解析构建的页面或递归控制树以更新所有内部链接
  3. 为页面上的所有内部链接添加语言代码。 (一旦我们知道它们都在哪里就很容易了)

注意:一些链接将由 .net HyperLink 控件提供,但其他链接将是通过富文本编辑器输入的 <a> 标签。

我看过的东西

我略读了 google,但没有找到似乎符合我们需求的内容:

欢迎所有建议:)

所以,会有动态内容和静态内容。 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 方法可以按照您希望的任何方式将页面作为字符串进行操作 - 在我们的例子中,我们使用查找和更新所有链接和本地文件路径。