2011-09-28 30 views
6

RenderControl方法有一個奇怪的問題。RenderControl方法不呈現自關閉標記

我有用戶控件(一個ASCX文件)這個加價:

<ul> 
<asp:Repeater ID="rptImages" runat="server"> 
    <ItemTemplate> 
     <li> 
      <a href="<%# ((Image)Container.DataItem).Url %>"> 
       <img src="<%# ((Image)Container.DataItem).Url %>?mw=80&mh=50" title="<%# ((Image)Container.DataItem).Title %>" alt="<%# ((Image)Container.DataItem).Alt %>" /> 
       <p><%# ((Image)Container.DataItem).Description %></p> 
      </a> 
     </li> 
    </ItemTemplate> 
</asp:Repeater> 
</ul> 

當這個代碼在正常頁面生命週期執行(例如,當它被添加到頁面),它呈現有效的XHTML作爲標記:

<ul> 
    <li> 
     <a data-fullscreen="/someimage.jpg" href="/another-image.jpg"> 
      <img src="/myimage?mw=80&mh=50" title="Image Title" alt="Alt Text" /> 
      <p></p> 
     </a> 
    </li> 
</ul> 

請注意p標記如何具有結束標記(即使它是空的),並且圖像標記也具有結束標記。

當我實例在服務器上的這種控制並嘗試使用它解析爲一個字符串這樣的RenderControl()方法:

StringBuilder builder = new StringBuilder(); 
using (StringWriter writer = new StringWriter(builder)) 
{ 
    using (XhtmlTextWriter htmlWriter = new XhtmlTextWriter(writer)) 
    { 
     var control = (GalleryControl)LoadControl("~/layouts/Controls/Gallery/GalleryControl.ascx"); 
     control.Images = m_images; 
     control.RenderControl(htmlWriter); 
    } 
} 
return builder.ToString(); 

則返回XHTML看起來像這樣:

<ul> 
    <li> 
     <a data-fullscreen="/someimage.jpg" href="/another-image.jpg"> 
      <img src="/myimage?mw=80&mh=50" title="Image Title" alt="Alt Text"> 
      <p> 
     </a> 
    </li> 
</ul> 

請注意image標記如何缺少其結束標記,並且p標記也未關閉,這使得此XHTML不再有效。

我花了整整一天的時間。我試過XhtmlTextWriter而不是HtmlTextWriter來傳入RenderControl,但是這沒有任何區別。

有沒有其他人遇到過這個問題?這非常奇怪,目前我們隊中的很多人都在爲難!任何幫助或想法,將不勝感激。

編輯:

我這個代碼在Sitecore的處理器堆正在執行可能應該提及。它在ExpandLinks處理器之前的「renderField」處理器堆棧中運行。

+0

@Sam:本'RenderControl'方法是從'Control'類繼承。 –

+0

我創建了一個解決方案,與您在此處顯示的內容幾乎相同,但無法重現相同的錯誤。輸出的HTML是有效的。順便說一下,我認爲你的Repeater的綁定發生在那個Images setter中? 「數據全屏」來自哪裏,你肯定會給我們什麼builder.ToString()返回,在任何JavaScript干擾發生之前? – Kasaku

+0

是的,我抓到了從builder.ToString()返回的文本並將其粘貼到此處。我認爲可能有其他的東西搞砸了,但這是從StringBuilder返回的,它被連接到HtmlTextWriter。 – NullReferenceException

回答

1

我懷疑這行不執行或拋出一個異常,吞下使其無法完成:

<%# ((Image)Container.DataItem).Description %> 
+1

如果您可以在Visual Studio中調試此功能,請嘗試更改您的調試設置,以便在拋出異常時顯示停止,而不是捕獲;這是查找吞嚥異常的好方法,它位於Debug - > Exceptions選項中。 –

+0

我啓用了例外但沒有任何被拋出。另外,當將圖像列表綁定到控件時,我檢查了「Description」屬性,它是一個空字符串,而不是null。 – NullReferenceException