2011-03-24 149 views
3

我有一個自定義Web部件,我試圖調用RenderContents方法,但結果只包含Web部件的周圍div,而沒有任何子控件。WebPart RenderControl不呈現內容

就拿這個簡單的Web部件:

namespace MyWebParts 
{ 
    public class MyTestWebPart : WebPart 
    { 
    public MyTestWebPart() 
    { 
     this.CssClass = "myTestWebPart"; 
    } 
    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 

     this.Controls.Add(new LiteralControl("Nothing here yet.")); 
    } 
    } 
} 

然後,在HTTP處理程序,我試圖實例化這個網絡的一部分,並調用其RenderControl方法。結果是<div class="myTestWebPart"></div>

有誰知道爲什麼我沒有從CreateChildControls獲取我的控件也添加到輸出?

回答

2

這是因爲當你只實例化一個控制和它調用RenderControl,沒有它被添加到Controls集合,然後它不是導致所有事件觸發的Page生命週期的一部分。

特別是調用EnsureChildControl的預渲染未被調用。

簡單的解決方法是重寫渲染這樣的:

protected override void Render(HtmlTextWriter writer) 
{ 
    EnsureChildControls(); 
    base.Render(writer); 
} 
+0

我把它,這意味着我的頁面生命週期事件將無法正確要麼然後解僱?我的web部分也有一個重寫的OnInit方法。所以我想這也不會被解僱。另外,爲了充分披露,我並沒有直接實例化我的Web部件。我實際上使用SPLimitedWebPartManager獲取它的一個實例(不知道這是否有所作爲)。 – TehOne 2011-03-24 18:22:40

+0

這是正確的,你可以使用調試器來驗證它。 – 2011-03-25 20:42:45

0

我會建議在編寫代碼渲染方法,而不是在擁有CreateChild控制寫