2010-04-28 65 views
1

我想要獲取以前在完整的.aspx頁面上存在的一堆代碼,並在.ashx處理程序中執行相同的操作。使用ASP.Net服務器控件代碼生成.ashx

代碼創建了一個HtmlTable對象,向這些行添加了行和單元格,然後將.aspx控件集合添加到html表中,然後將其添加到頁面上已有的div。

我試圖保持代碼的機智,但不是將控件放入div中,而是實際生成html,然後我將在可通過AJAX客戶端調用的大塊文本中返回該代碼。

當我嘗試使用InnerHtml屬性(表示它不支持)時出現HtmlTable錯誤,並且當我嘗試RenderControl時,在首先創建一個TextWriter和一個HtmlTextWriter對象之後,出現頁面不能爲空的錯誤。

有沒有人做過這個?有什麼建議麼?

回答

2

*最近的是上面。

OK,甚至在馬特的更新是有解決辦法;)

首先,我們必須使用一個頁面,裏面form。否則,我們將無法添加ScriptManager控件。還有一件事:ScriptManager控件應該是表單中的第一個控件。進一步更容易:

Page page = new Page(); 
Button button = new System.Web.UI.WebControls.Button 
{ 
    ID = "btnSumbit", 
    Text = "TextButton", 
    UseSubmitBehavior = true 
}; 
HtmlForm form = new HtmlForm 
{ 
    ID="theForm" 
}; 
ScriptManager scriptManager = new ScriptManager 
{ 
    ID = "ajaxScriptManager" 
}; 
form.Controls.Add(scriptManager); 
form.Controls.Add(button); 
page.Controls.Add(form); 

using (StringWriter output = new StringWriter()) 
{ 
    HttpContext.Current.Server.Execute(page, output, false); 

    context.Response.ContentType = "text/plain"; 
    context.Response.Write(output.ToString()); 
} 

這個工程。輸出是相當大的,所以我決定不包括它到我的答案:)


其實,有一個解決方法。是的,我們可以在處理程序中進行控制。

首先,我們需要一個無頁面。因爲沒有它,我們得到:

控制類型「按鈕」的「btnSumbit」 必須放在一個表單標籤內有 RUNAT =服務器。

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

其次,沒有人能阻止我們創造我們FormlessPage頁面的一個實例。現在讓我們在那裏添加一個控件(我決定添加一個Button控件作爲示例,但您可以使用任何控件)。

FormlessPage page = new FormlessPage(); 
Button button = new System.Web.UI.WebControls.Button 
{ 
    ID = "btnSumbit", 
    Text = "TextButton", 
    UseSubmitBehavior = true 
}; 
page.Controls.Add(button); 

第三,讓我們捕捉輸出。爲此,我們使用HttpServerUtility.Execute方法:

執行在當前 請求的上下文中指定 虛擬路徑的處理程序。甲 System.IO.TextWriter捕獲輸出 從執行處理程序和一個 布爾參數指定是否 清楚 System.Web.HttpRequest.QueryStringSystem.Web.HttpRequest.Form 集合。

下面是代碼:

using (StringWriter output = new StringWriter()) 
{ 
    HttpContext.Current.Server.Execute(page, output, false); 

    context.Response.ContentType = "text/plain"; 
    context.Response.Write(output.ToString()); 
} 

結果將是:

<input type="submit" name="btnSumbit" value="TextButton" id="btnSumbit" />

另外,我可以推薦ScottGu的文章Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios。希望,你可以在那裏找到很多有用的東西。

+0

這對於我需要的90%很好,所以非常感謝你。但是,我還剩下1條絆腳石。有Telerik控件需要在這裏呈現。我可以添加控件,但是他們需要一個腳本管理器,或者它在渲染時會爆炸。我已經嘗試在頁面中添加一個作爲控件,但是隨後出現了未設置爲實例的對象錯誤。 – 2010-04-28 20:57:36

相關問題