我想使用jquery ajax加载用户控件。我发现一个可能是通过通用处理程序加载usercontrol。任何人都帮助我。这里是我用来调用控件的ajax代码。
<script type="text/javascript">
function fillSigns() {
$.ajax({
url: "usercontrolhandler.ashx?control=signs.ascx",
context: document.body,
success: function (data) {
$('#signdiv').html(data);
}
});
}
</script>
这是处理程序文件中的代码
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
Page page = new Page();
UserControl ctrl = (UserControl)page.LoadControl("~/" + context.Request["control"] + ".ascx");
page.Form.Controls.Add(ctrl);
StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
ctrl.RenderControl(tw);
context.Response.Write(stringWriter.ToString());
}
此代码在下面显示的行中引发了对象引用未找到错误。
page.Form.Controls.Add(ctrl);
答案 0 :(得分:3)
这里似乎page.Form
是null
,这就是为什么你有一个空引用异常的原因。您可以将用户控件添加到页面的控件集合中:
page.Controls.Add(ctrl);
您还可以使用HttpServerUtility.Execute
方法进行页面呈现:
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(page, output, false);
最后看一下Scott Guthrie撰写的Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios文章,其中涵盖了您的问题。
答案 1 :(得分:1)
试试这个:
Page page = new Page {ViewStateMode = ViewStateMode.Disabled};
HtmlForm form = new HtmlForm { ViewStateMode = ViewStateMode.Disabled };
form.Controls.Add(ctrl);
page.Controls.Add(form);
然后:
StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
page.RenderControl(tw);
context.Response.Write(stringWriter.ToString());