Подход к нацеливанию обработчика HTTP из нажатия кнопки - PullRequest
0 голосов
/ 14 февраля 2011

Основная цель здесь - настроить обработчик на загрузку файла, который предварительно просматривается.

Существует два различных условия файла: одно, где он уже сохранен в базе данных, затем следующие параметры для обработчика через строку запроса

COIHandler.axd? Action = preview_saved & letterId =xxxx

или

тот, который еще не был сохранен, в котором я сохраняю его в сеансе и нацеливаю обработчик следующим образом

COIHandler.axd? Action= preview_unsaved

, тогда обработчик выполнит очистку сессии после того, как я закончу.Любые мысли о том, как это сделать.Все еще плохо знакомы с обработчиками http.

УТОЧНЕНИЕ

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

Я хочу, чтобы пользователь оставался на той же странице, когда он нажимал кнопку загрузки.

Я не хочу просто перенаправлять в javascriptэто будет предназначаться для обработчика, и я хотел бы избежать всплывающего окна, если это возможно.Не совсем уверен, если это оставляет какие-либо варианты

Ответы [ 3 ]

0 голосов
/ 14 февраля 2011

В комментарии «Ответ на Ядс» вы можете использовать обработчик нажатия кнопки на своей странице, чтобы загрузить файл без необходимости всплывающего окна или отдельного обработчика HTTP.

protected void btnDownload_OnClick(object sender, EventArgs args)
{       
    PDFContentData data = GeneratePDFData(); //parses strings from some source (as mentioned in comments)
    WebFileUtil.InvokePDFDownload(Page.Context, data);
}

public static class WebFileUtil
{
    public static void InvokePDFDownload(HttpContext context, PDFContentData data)
    {
        context.Response.Clear();
        context.Response.ClearContent();
        context.Response.ClearHeaders();

        FileStore.generateDocument(data, context.Response.OutputStream);

        context.Response.ContentType = "application/pdf"; 
        context.Response.ContentEncoding = System.Text.Encoding.UTF8;
        context.Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}_Documenth.pdf", DateTime.Now.ToShortDateString()));
        context.Response.End();
    }
}
0 голосов
/ 15 февраля 2011

Прежде всего, большое спасибо за все возможные решения, которые они помогли в выходе за рамки.

Я нашел уникальное решение, которым, я думал, поделюсь.

  1. Я помещаю невидимый iframe в HTML-разметку моей страницы.

  2. затем я установил свойство OnClientClick в кнопке загрузки моего серверного элемента управления (это позволяет мне отображать строку параметра в атрибуте onclick html)

    Я установил свойство для метода javascript, который реализует рекурсивный алгоритм для перехода к верхнему родительскому фрейму страницы, как только он достигает этой точки, я использую просто селектор JQuery для поиска фрейма, о котором я говорил на шаге 1 . (Причиной рекурсии является поддержка мастер-страниц, где у вас будут фреймы внутри фреймов).

  3. Установите атрибут src iframe для целевого обработчика HTTP. Применяемое поведение приводит к тому, что iframe загружает запрошенный источник ... но в данном случае это обработчик, и, поскольку все это было сделано изначально из прямого пользовательского ввода (с помощью нажатия кнопки «Загрузить»), у вас даже не возникнет проблема получить желтый бар с IE7 +

  4. Обработчик обрабатывает запрос, а файл передается в браузер

Ура!

0 голосов
/ 14 февраля 2011

Ваш обработчик будет на самом деле .ashx. В остальном ваш подход кажется нормальным. Вы можете проверить контекст, который передается в метод PrcoessRequest.

public void ProcessRequest(HttpContext context)
{
    switch(context.Request.QueryString["Action"].ToLower())
    {
       case "preview_saved":
           //do stuff for saved
       case "preview_unsaved":
           //do stuff for unsaved
     }
}

ОБНОВЛЕНИЕ Если вам нужен центральный обработчик, то вы либо захотите перенаправить пользователя в конце вызова, и в этом случае вы также захотите передать параметр returnUrl в Строка запроса. Тогда вы можете просто сделать context.Response.Redirect(context.Request.QueryString["returnUrl"]). Или, если вы хотите, чтобы страница сохранила свое состояние, вам придется сделать Ajax-вызов вашему обработчику.

...