*最近的是上面。
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.QueryString
和 System.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。希望,你可以在那裏找到很多有用的東西。
這對於我需要的90%很好,所以非常感謝你。但是,我還剩下1條絆腳石。有Telerik控件需要在這裏呈現。我可以添加控件,但是他們需要一個腳本管理器,或者它在渲染時會爆炸。我已經嘗試在頁面中添加一個作爲控件,但是隨後出現了未設置爲實例的對象錯誤。 – 2010-04-28 20:57:36