2011-05-12 15 views
1

[OK]をクリックします。これは大きなものです。私は問題を説明しようとしますが、もっと情報が必要な場合はお知らせください。SharePoint 2010 >>出力HTMLの編集>>ページまたはマスターページのレンダリングに関する問題

SharePoint 2010が生成するHTMLを変更したいと思います。 私は他のオブジェクトの中でHTMLの文字列を取り、ソースを変更するHTMLアジリティ・パックを使用します。

SPには完全なソースを変更する2つの方法があります。

  1. コントロールを使用するコントロール、コントロールを拡張するページ、マスターページ、またはContentPlaceHolderのレンダリングメソッドにアクセスして、HTMLを取得し、変更してから書き込むことができます。
  2. は、フィルタとHTTPモジュールを使用して出力ストリーム

を変更する残念ながら、これらの方法の両方に問題があります。

2番のフィルタはうまく機能しますが、出力キャッシュを無効にする必要があります。 私はこれを行うことはできません。私のブランドサイトには大量のトラフィックがあります。 したがって、SharePoint 2010チームが回避策を提案/提示するまで、フィルタは問題になります。私は彼らのことを知っている旅行のどこかで読んで、それについて何かしています。

1は素晴らしいです。私は単純に以下を使用し、ページのHTMLを変更できますが、大きな問題が1つあります。

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>" 

これは、最初のHTMLタグの前には何もないので注意することが重要です。オープニング "<"は0の位置にあります。

しかし、HTMLがブラウザで終わると、次のようになります。

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

また、リボンの右上のウェルカムエリアにユーザー名が表示されません。これは、リボンの開始タグの前に配置されているためです。

レンダオーバーライドでライターオブジェクトに何も割り当てないと、ブラウザのページにHTMLタグの前のすべてが表示されます。面白いことは何も表示すべきではないということです!

他のページにアクセスした場合。リストビューを持つ任意のページ。すべての項目はタグの前にレンダリングされます。 htmlではなく、単なる値であることに注意することが重要です。リスト項目のHTMLは、リストビューのどこに表示されるべきかが決まります。

たとえば、 (ページは "/_layouts/viewlsts.aspx")

レンダオーバーライドなし。

<html... 

... 
//The Table where the data should be. 
<tr> 
    <td class="ms-gb" colspan="5" style="white-space:nowrap;"> 
     <h3 class="ms-standardheader"> 
      &#160; Picture Libraries 
     </h3> 

    </td> 
</tr> 

<tr><td class="ms-vb2 ms-viewlsts-noitems" colspan="6"> 
    There are no picture libraries. To create one, click <b>Create</b> above. 
</td></tr> 

<tr> 
    <td class="ms-gb" colspan="5" style="white-space:nowrap;"> 
     <h3 class="ms-standardheader"> 

      &#160; Lists 
     </h3> 
    </td> 
</tr> 

<tr><td class="ms-vb2 ms-viewlsts-noitems" colspan="6"> 
    There are no lists. To create one, click <b>Create</b> above. 
</td></tr> 

<tr> 

    <td class="ms-gb" colspan="5" style="white-space:nowrap;"> 
     <h3 class="ms-standardheader"> 
      &#160; Discussion Boards 
     </h3> 
    </td> 
</tr> 

<tr class="ms-alternatingstrong"> 
    <td class="ms-vb-icon"> 

      <a id="viewlistDiscussionBoard" href="/Lists/Discussion%20Board/AllItems.aspx" > 

      <img border="0" alt="Discussion Board" src="/_layouts/images/itdisc.png" width="16" height="16" /></a> 
    </td> 
    <td class="ms-vb2" > 
      <a id="viewlistDiscussionBoard" href="/Lists/Discussion%20Board/AllItems.aspx">Discussion Board</a>&#160; 
    </td> 

    <td class="ms-vb2" width="40%" > 
      &#160; 
    </td> 

    <td class="ms-vb2" width="3%" align="right"> 
    1 
    </td> 
    <td class="ms-vb2" width="25%" > 
     <nobr> 
     3 days ago 
     </nobr> 
    </td> 
</tr> 
...</html> 

レンダオーバーライドを使用します。

DOMAIN\user<script type="text/javascript"> 
//<![CDATA[ 
var _spUserId=1; 
//]]> 
</script>Document Libraries"viewlistDocumentLibrary""/AnalyticsReports/Forms/AllItems.aspx""Customized Reports""/_layouts/images/itdl.png""viewlistDocumentLibrary""/AnalyticsReports/Forms/AllItems.aspx"Customized ReportsThis Document library has the templates to create Web Analytics custom reports for this site collection04 days ago"viewlistDocumentLibrary""/Style%20Library/Forms/AllItems.aspx""Style Library""/_layouts/images/itdl.png""viewlistDocumentLibrary""/Style%20Library/Forms/AllItems.aspx"Style LibraryUse the style library to store style sheets, such as CSS or XSL files. The style sheets in this gallery can be used by this site or any of its subsites.04 days agoPicture LibrariesThere are no picture libraries. To create one, click <b>Create</b> above.ListsThere are no lists. To create one, click <b>Create</b> above.Discussion Boards"viewlistDiscussionBoard""/Lists/Discussion%20Board/AllItems.aspx""Discussion Board""/_layouts/images/itdisc.png""viewlistDiscussionBoard""/Lists/Discussion%20Board/AllItems.aspx"Discussion Board13 days agoSurveysThere are no surveys. To create one, click <b>Create</b> above.Blog0 
<html... 

//The Table where the data should be. 
... 
<tr> 
    <td class="ms-gb" colspan="5" style="white-space:nowrap;"> 
     <h3 class="ms-standardheader"> 

      &#160; 
     </h3> 
    </td> 
</tr> 

<tr><td class="ms-vb2 ms-viewlsts-noitems" colspan="6"> 

</td></tr> 

<tr> 
    <td class="ms-gb" colspan="5" style="white-space:nowrap;"> 
     <h3 class="ms-standardheader"> 

      &#160; 
     </h3> 
    </td> 
</tr> 

<tr class="ms-alternatingstrong"> 
    <td class="ms-vb-icon"> 

      <a id= href= > 
      <img border="0" alt= src= width="16" height="16" /></a> 
    </td> 

    <td class="ms-vb2" > 
      <a id= href=></a>&#160; 
    </td> 

    <td class="ms-vb2" width="40%" > 
      &#160; 
    </td> 
    <td class="ms-vb2" width="3%" align="right"> 

    </td> 
    <td class="ms-vb2" width="25%" > 

     <nobr> 

     </nobr> 
    </td> 
</tr> 
... </html> 

私の推測では、それがページまたはマスターページは、メソッドをレンダリングした後、それはオブジェクトの操作のいくつかの並べ替えがあることは明らかだいずれにせよ...

をリソースファイルとは何かを持っています。私はそれを見つけることができません。

HTTPモジュールのフィルタストリームに適切な場所にHTMLがあります。 ページ間のどこかでレンダリングし、HTMLをブラウザに送信すると、何か問題が発生しています。

ここには、同じ問題を何も役に立たないと回答している人が2人います。

  1. Link 1
  2. Link 2

私はこの上の任意の洞察力をいただければ幸いです!ありがとう!

+0

こんにちはTommmy、この問題の解決策を見つけましたか? – Serhiy

答えて

2

この問題は、レンダリング時に出力キャッシュを妨害するページの何か、より具体的にはPostCacheSubstitutionTextHelperクラスの動作によって発生します。上のRenderへの呼び出しがこれをトリガーしている可能性があります。

welcome.asxc制御(擬似シーケンス図)のように約振る舞う:

ページレンダリング> Welcome.ascxがレンダリング> PersonalActionsがレンダリング> PostCacheSubstitutionText.Render> PostCacheSubstitutionTextHelper.RenderAndRegisterSubstitutionCallbackHandler PostCacheSubstitutionText.Render(の新しいインスタンス) (デリゲートで呼び出され、HtmlTextWriterに書き込む)> PostCacheSubstitutionTextHelper。

// in bottom of directives in /CONTROLTEMPLATES/Welcome.ascx 
<%@ OutputCache Duration="1" VaryByParam="none" %> 

:SharePointののフリークショーとオーバーハイブにあなたのwelcome.ascxにこれを追加すること

てみてください:-)この問題を回避するにように、十分なRenderAndRegisterSubstitutionCallbackHandler HttpContext.Response.WriteSubstitution(stuffFromNewInstanceOfPostCacheSubstitutionText)

ユーザーコントロールには0が許可されていないため、期間は1に設定されています。これは失敗のための理論的な可能性を残すが、我々のシナリオではうまくいった。

+0

恐ろしい! Madsに感謝します。しかし、クイック質問。これをプログラムで設定するにはどうすればよいですか?私は14ハイブのファイルを編集することはできません。私はマスターページのコードの背後にあるコントロールにアクセスしようとしました。これをウェルカムコントロールとしてキャストし、CachePolicyのプロパティを変更してタグに一致させましたが、キャッシュがこのコントロールに設定されていないというエラーが表示されます。任意のヒントは、私は任意のコントロールをターゲットとすることができ、1に期間を設定することが素晴らしいだろう! – Tommy4x

0

私はこの同じ問題に遭遇しました。マスターページからこの行を削除することで問題を回避できました。

<wssuc:Welcome id="IdWelcome" runat="server"> 
</wssuc:Welcome> 
関連する問題