SharePoint 2010 >> Редактирование выходного HTML >> Проблемы с переопределением рендеринга страницы или главной страницы - PullRequest
1 голос
/ 12 мая 2011

Хорошо. Это большой. Я постараюсь объяснить мою проблему, но, если понадобится дополнительная информация, дайте мне знать.

Я хотел бы изменить HTML-код, создаваемый SharePoint 2010. Я собираюсь использовать HTML Agility Pack], который возьмет строку HTML среди других объектов и изменит источник.

Существует 2 способа изменения полного источника в SP.

  1. Использование адаптеров управления или расширение элементов управления. Я могу получить доступ к методам рендеринга Page, MasterPage или даже ContentPlaceHolder, получить HTML-код, изменить его, а затем записать.
  2. Использование модуля HTTP с фильтром и изменение выходного потока

К сожалению, есть проблемы с обоими этими методами.

Номер 2, фильтр работает хорошо, но вы должны отключить кэш вывода. Я не могу этого сделать. У сайтов, на которых я работаю, много трафика. Таким образом, фильтры являются спорными, пока команда SharePoint 2010 не исправит / не предложит нам обходной путь. Я где-то читал в своих путешествиях, что они знают и будут что-то делать с этим.

Номер 1 прекрасно работает. Я просто использую следующее и могу изменить 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 добавляет данные в модуль записи / или изменяет элементы управления после переопределения рендеринга для страницы / MasterPage.

Когда я отлаживаю, прохожу и просматриваю строку html, это выглядит следующим образом.

"<html ....  ....</html>"

Это важно отметить, поскольку перед первым HTML-тегом ничего нет. Открытие "<" находится в положении 0. </p>

Но когда 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>

Полагаю, это как-то связано с файлами ресурсов.

В любом случае очевидно, что после методов рендеринга Page или MasterPage происходит какая-то манипуляция с объектами. Я просто не могу его найти.

Поток фильтра моего модуля HTTP содержит HTML в нужном месте. Так что где-то между рендером страницы и отправкой HTML в браузер что-то происходит.

Вот еще пара человек, сообщивших об этой проблеме без каких-либо полезных ответов.

  1. Ссылка 1
  2. Ссылка 2

Буду признателен за понимание этого вопроса! СПАСИБО!

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Проблема вызвана тем, что на странице что-то мешает выходному кешу во время рендеринга, а более конкретно поведением класса PostCacheSubstitutionTextHelper.Вероятно, ваш вызов Render выше вызывает это.

Элемент управления welcome.asxc ведет себя примерно так (схема псевдопоследовательности):

Визуализация страницы> Welcome.ascx Визуализация> Персональный рендеринг> PostCacheSubstitutionText.Render> PostCacheSubstitutionTextHelper.RenderAndRegisterSubstitutionCallbackHandler (новый экземпляр) PostCacheSubstitutionText.Render (вызывается в делегате и теперь записывает в HtmlTextWriter)> PostCacheSubstitutionTextHelper.RenderAndRegisterSubstitutionCallbackHandler HttpContext.Response.WriteSubstitution (stuffFromNewInstanceOfPostCacheSubstitutionText)

Этого достаточно с странной точкой обмена и точкой обхода: -)

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

Обратите внимание, что для параметра Длительность установлено значение 1, поскольку 0 не разрешено для пользовательских элементов управления.это оставляет теоретическую вероятность неудачи, но в нашем сценарии это сработало.

0 голосов
/ 03 марта 2013

Я столкнулся с той же проблемой, я смог ее обойти, удалив эту строку с главной страницы.

<wssuc:Welcome id="IdWelcome" runat="server">
</wssuc:Welcome>
...