Как мне получить пользовательский IHttpHandler, способный обрабатывать обратные передачи?

StackOverflow https://stackoverflow.com/questions/1093405

Вопрос

Я пишу собственный обработчик HTTP, чтобы предоставить форму редактирования сетки с использованием существующих пользовательских элементов управления.По сути, мой обработчик создает страницу, форму, заголовок и другие элементы управления, необходимые для правильной отрисовки существующих пользовательских элементов управления, а в конце ProcessRequest я использую Server.Execute для выполнения страницы, которая была создана динамически.Я делаю это, потому что решение, в котором это находится, представляет собой проект пользовательских элементов управления, и в нем нет страниц, и мы не можем их добавить.Его необходимо повторно использовать для нескольких проектов.

Это отлично работает до тех пор, пока пользовательские элементы управления, добавленные на эту «страницу», не потребуют использования механизма обратной передачи.В пользовательском элементе управления Page.IsPostBack всегда имеет значение false, и события элемента управления (например, нажатие кнопки) не обрабатываются.Очевидно, что мне не хватает какой-то важной детали в том, как работает типичная страница ASP.NET.Класс Page — это всего лишь реализация IHttpHandler, но здесь много кода, который, по моему мнению, не нужен для работы базовых функций.

Есть идеи?

Вот базовый код моего базового обработчика HTTP.У меня есть другие классы, которые наследуются от этого базового обработчика и добавляют фактические пользовательские элементы управления в форму страницы.

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

        HtmlGenericControl htmlPage = GetHtml();
        AddTitle();
        htmlPage.Controls.Add(_head);

        HtmlGenericControl htmlBody = GetBody();

        _form.Action = context.Request.Url.ToString();
        _form.Method = "POST";
        htmlBody.Controls.Add(_form);

        htmlPage.Controls.Add(htmlBody);

        AddAjaxManager();
        AddScriptManager();

        _page.Controls.Add(htmlPage);
        //_page.ProcessRequest(context);

        context.Response.CacheControl = "No-Cache";
        context.Server.Execute(_page, context.Response.Output, true);
    }

    public bool IsReusable { get { return false; } }
Это было полезно?

Решение

Чтобы это работало, я унаследовал от Пейджа вместо реализации IHttpHandler.Вам все равно придется создать весь HTML-код страницы, но при этом вы получите все чудеса (или нет) жизненного цикла страницы ASP.NET WebForms.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top