*最新的在上面。
好的,即使在马特的更新之后也有解决方法;)
首先,我们必须使用一个内部有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。希望,你可以在那里找到很多有用的东西。