SharePoint 2010>&燃气轮机;编辑输出HTML>&燃气轮机;页面或母版页呈现覆盖问题

SharePoint 2010>&燃气轮机;编辑输出HTML>&燃气轮机;页面或母版页呈现覆盖问题,html,sharepoint-2010,overriding,Html,Sharepoint 2010,Overriding,嗯。这是一个大的。我会尽力解释我的问题,但如果你需要更多信息,请告诉我 我想更改SharePoint 2010生成的HTML。 我将使用HTML Agility Pack],它将在其他对象中获取一个HTML字符串,并更改源代码 有两种方法可以更改SP中的完整源 使用控件适配器或扩展控件,我可以访问页面、母版页甚至ContentPlaceHolder呈现方法,获取HTML,修改它,然后编写它 使用带有筛选器的HTTP模块并更改输出流 不幸的是,这两种方法都存在问题 第二,过滤器工作正常,但必须禁用

嗯。这是一个大的。我会尽力解释我的问题,但如果你需要更多信息,请告诉我

我想更改SharePoint 2010生成的HTML。 我将使用HTML Agility Pack],它将在其他对象中获取一个HTML字符串,并更改源代码

有两种方法可以更改SP中的完整源

  • 使用控件适配器或扩展控件,我可以访问页面、母版页甚至ContentPlaceHolder呈现方法,获取HTML,修改它,然后编写它
  • 使用带有筛选器的HTTP模块并更改输出流
  • 不幸的是,这两种方法都存在问题

    第二,过滤器工作正常,但必须禁用输出缓存。 我不能这样做。我创建的网站拥有大量的流量。 因此,在SharePoint 2010团队修复/向我们介绍解决方案之前,过滤器是没有意义的。在我的旅行中,我读到了他们意识到并将为此做些什么的地方

    第一个很好用。我只是简单地使用下面的代码,我可以修改页面的HTML,但是有一个大问题

    HtmlDocument hd    = new HtmlDocument(); //Agility HTML Object.
    StringBuilder sb   = new StringBuilder();
    StringWriter sw    = new StringWriter(sb);
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    
    //Render Object into HtmlTextWriter
    base.Render(htw);
    
    //String to hold the HTML from the StringBuilder of the HtmlTextWriter
    string html = sb.ToString();
    
    //Mess with the String here using the Agility HTML Pack
    
    //Write the HTML to the writer
    writer.Write(html);
    
    //Done!
    
    这段代码效果很好,但SharePoint 2010在页面/母版页的呈现覆盖后将数据附加到编写器/或更改控件

    当我调试、浏览并查看html字符串时,它如下所示

    "<html ....  ....</html>"
    
    DOMAIN\user<script type="text/javascript">
    //<![CDATA[
    var _spUserId=1;
    //]]>
    </script>
    <html... 
    ....</html>
    

    “该问题是由页面中的某些内容在呈现期间干扰outputcache造成的,更具体地说,是PostCacheSubstitutionTextHelper类的行为造成的。您对上面呈现的调用可能会触发此问题

    welcome.asxc控件的行为大致如下(伪序列图):

    页面呈现>Welcome.ascx呈现>PersonalActions呈现>PostCacheSubstitutionText.呈现>PostCacheSubstitutionTextHelper.RenderAndRegisterSubstitutionCallbackHandler (的新实例)PostCacheSubstitutionText.Render(在委托中调用,现在写入HtmlTextWriter)>PostCacheSubstitutionTextHelper.RenderRegisterSubstitutionCallbackHandler HttpContext.Response.WriteSubstitution(StuffFromNewInstanceOffPostCacheSubstitutionText)

    sharepoint怪胎秀到此为止,接下来是解决方法:-)

    尝试将此添加到配置单元中的welcome.ascx:

    // in bottom of directives in /CONTROLTEMPLATES/Welcome.ascx
    <%@ OutputCache Duration="1" VaryByParam="none" %>
    
    //在/CONTROLTEMPLATES/Welcome.ascx中指令的底部
    

    请注意,由于用户控件不允许使用0,因此持续时间设置为1。这在理论上可能导致失败,但在我们的场景中,它起到了作用。

    我遇到了同样的问题,我可以通过从母版页中删除这一行来解决此问题

    <wssuc:Welcome id="IdWelcome" runat="server">
    </wssuc:Welcome>
    
    
    
    Awesome!谢谢Mads。不过有一个简单的问题。我如何以编程方式设置它?我无法在14配置单元中编辑文件。我试图从母版页代码中访问该控件,将其转换为欢迎控件,并修改CachePolicy上的属性以匹配标记,但我收到一个错误,说缓存没有为此配置单元设置控件?有什么提示可以让我针对任何控件并将持续时间设置为1就太好了!你好,Tommmy,你找到解决这个问题的好方法了吗?
    // in bottom of directives in /CONTROLTEMPLATES/Welcome.ascx
    <%@ OutputCache Duration="1" VaryByParam="none" %>
    
    <wssuc:Welcome id="IdWelcome" runat="server">
    </wssuc:Welcome>