2011-05-10 53 views
4

我試圖創建一個可以作爲電子郵件發送的用戶控件模板。在帶有服務器控件的頁面上使用LoadControl

在一個工具類我有一個包含此代碼的方法:

StringBuilder sb = new StringBuilder(); 
Page p = new Page(); 
UserControl ctrl = (UserControl)p.LoadControl("~/EmailTemplates/OrderConfirmation.ascx"); 
StringWriter sw = new StringWriter(sb); 
Html32TextWriter htw = new Html32TextWriter(sw); 

ctrl.RenderControl(htw); 

這正確地寫入用戶控件的文本,但是如果我想用一臺服務器控制,如控制網頁的內部列表視圖,listview從不被評估。看起來只有內聯代碼塊被評估。我怎樣才能解決這個問題?

+0

你可以粘貼一些代碼給我們看看控件的外觀嗎?因爲它應該很好...... – 2011-05-10 01:29:07

回答

5

你應該控制實際添加到一個頁面,執行該頁面:

var page = new FormlessPage(); 
    var ctrl = (UserControl)page.LoadControl("~/EmailTemplates/OrderConfirmation.ascx"); 

    page.Controls.Add(ctl); 
    StringWriter writer = new StringWriter(); 
    HttpContext.Current.Server.Execute(page, writer, false); 
    return writer.ToString(); 

無形頁面只是看起來像:

public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 

它可以讓你的控制有沒有<form>包裝輸入元素。

此方法將調用您的頁面生命週期方法並很好地綁定您的表單元素。

+0

謝謝......非常。這是令人沮喪的一天。這很有趣,你可以像這樣執行頁面。 – 2011-05-10 01:33:26

+0

@尼克:不客氣。我正在做類似的事情,我通過將用戶控件切換到「只讀」模式來重新使用用戶控件來構建HTML報告。我記得花了幾個小時試圖建立或追蹤解決方案。很高興我能幫上忙! – 2011-05-10 01:35:00

0

您可以擁有一個Public函數(又名ProcessLoad),而不是Page_Load函數,並在加載控件後立即調用它。這樣你可以傳遞參數給你的UserControl。

相關問題