c # asp.net Как вернуть usercontrol от Handeler Ashx? - PullRequest
1 голос
/ 09 июня 2010

Я хочу вернуть вывод HTML элемента управления из обработчика. Мой код выглядит так:

с использованием системы; используя System.IO; использование System.Web; использование System.Web.UI; использование System.Web.UI.WebControls;

открытый класс PopupCalendar: IHttpHandler {

public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";

    System.Web.UI.Page page = new System.Web.UI.Page();
    UserControl ctrl = (UserControl)page.LoadControl("~/Controls/CalendarMonthView.ascx");
    page.Form.Controls.Add(ctrl);

    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
    ctrl.RenderControl(tw);
    context.Response.Write(stringWriter.ToString());
}

public bool IsReusable {
    get {
        return false;
    }
}

}

Я получаю сообщение об ошибке:

Ошибка сервера в приложении '/ CMS'. В экземпляре объекта не задана ссылка на объект. Описание: необработанное исключение произошло во время выполнения текущей веб-страницы. запрос. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и где она возник в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

Ошибка источника:

Строка 14: страница System.Web.UI.Page = новая System.Web.UI.Page (); Строка 15: UserControl ctrl = (UserControl) page.LoadControl ("~ / Controls / CalendarMonthView.ascx"); Строка 16: page.Form.Controls.Add (ctrl); Строка 17:
Строка 18: StringWriter stringWriter = new StringWriter ();

Как я могу вернуть выходные данные Usercontrol через обработчик?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2012

Используйте метод BuildManager.GetCompiledType, чтобы загрузить существующую страницу с желаемым содержимым, установить некоторые общедоступные свойства с помощью реализации интерфейса и вызвать запрос процесса, приведенный к httphander. Таким образом, вы не открываете страницы aspx напрямую и можете выбирать разные страницы для различных параметров из одного и того же ресурса ashx. Также важно, чтобы вы сохраняли преимущества и возможности страниц asp.net.

1 голос
/ 11 февраля 2014

Вы можете попробовать это:

System.Web.UI.Page page = new System.Web.UI.Page();
UserControl ctrl = (UserControl)page.LoadControl("~/Controls/CalendarMonthView.ascx");
page.Form.Controls.Add(ctrl);

ctrl.DoSomething();

context.Response.CacheControl = "No-Cache";
context.Server.Execute(page, context.Response.Output, true);
0 голосов
/ 09 июня 2010

Вы не можете просто new создать экземпляр такого класса страниц и заставить его работать должным образом. Я вполне уверен, что вам нужно создать его с помощью вызова GetCompiledPageInstance ( на основе обсуждения здесь ).

...