Как мы можем загрузить usercontrol, используя универсальный обработчик?
Я хочу загрузить пользовательский элемент управления с помощью 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);
2 ответа
Похоже на то page.Form
является null
вот почему у вас исключение нулевой ссылки. Вместо этого вы можете добавить свой пользовательский элемент управления в коллекцию элементов управления страницы:
page.Controls.Add(ctrl);
Вы также можете использовать HttpServerUtility.Execute
метод для рендеринга страницы:
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(page, output, false);
И, наконец, взгляните на Совет / Уловка: классная техника шаблонирования пользовательского интерфейса для использования с ASP.NET AJAX для сценариев, не относящихся к UpdatePanel, в статье Скотта Гатри, которая освещает вашу проблему.
Попробуй это:
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());