2010-05-12 2 views
3

Пожалуйста, обратите внимание на следующее событие щелчка ...Принуждение постбэк Asp.Net

 
Protected Sub btnDownloadEmpl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownloadEmpl.Click 
     Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() 
     Dim d As String = Format(Date.Now, "d") 
     Dim ad() As String = d.Split("/") 
     Dim fd As String = ad(0) & ad(1) 
     Dim fn As String = "E_" & fd & ".csv" 
     Response.ContentType = "text/csv" 
     Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
     CreateCSVFile(emplTable, Response.Output) 
     Response.Flush() 
     Response.End() 
     lblEmpl.Visible = True 
    End Sub 

Этот код просто экспортирует данные из DataTable в файл CSV. Проблема здесь: lblEmpl.Visible = true никогда не попадает, потому что этот код не вызывает обратную передачу на сервер. Даже если я поместил строку кода lblEmpl.Visible = true в верхнюю часть события click, строка выполнится отлично, но страница никогда не обновляется. Как я могу это исправить?

+0

Вы работаете с той же проблемой, как этот пост: http://stackoverflow.com/questions/2731971/problem-clearing-text-fields-on-vb-net-project-vs2008/2732657 # 2732657 –

ответ

4

Эта линия:

lblEmpl.Visible = True 

Никогда не получает удар, потому что эта линия:

Response.End() 

Бросает ThreadAbortException

Я думаю, что уборщик способ справиться с этим, чтобы создать простой компонент HttpHandler , и «открыть» его во всплывающем окне. (Всплывающее окно не должно открываться фактически. В большинстве случаев браузер понимает, что это фактически загрузка, и будет подавлять вкладку/окно.)

Изучите интерфейс IHttpHandler. На самом деле их довольно просто реализовать.

Вот пример обработчика. К сожалению это заняло некоторое время, я был призван на встречу:

public class CensusHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     string fileName = String.Format(
      CultureInfo.CurrentUICulture, 
      "E_{0:00}{1:00}.csv", 
      DateTime.Today.Month, 
      DateTime.Today.Day 
      ); 

     context.Response.ContentType = "text/csv"; 
     context.Response.AddHeader(
      "Content-Disposition", String.Format(null, "attachment; filename={0}", fileName) 
      ); 

     //Dump the CSV content to context.Response 

     context.Response.Flush(); 
    } 

    public bool IsReusable { get { return false; } } 
} 

OK, попробуйте добавить яваскрипт OnClick события, чтобы вызвать загрузку:

<asp:Button ID="Clickety" runat="server" Text="Click Me!" OnClick="Clickety_Click" 
    OnClientClick="window.open('Handler.ashx', 'Download');" /> 

Регулярного OnClick события будет срабатывать код обратной передачи. Событие javascript onclick (OnClientClick) запустит загрузку через HttpHandler.

+0

Что делать, если я не помещаю строку Response.End там, каков будет эффект. Есть ли недостаток? –

+0

Даже если я комментирую строку Response.End, она все равно не работает. –

+0

Я искал сеть и не уверен, что вы имеете в виду. Раньше я никогда не использовал HttpHandler. Можете ли вы указать мне хороший пример? –

1

Вы отправляете CSV по потоку ответа, а затем завершаете его. Поэтому, как только весь ваш код запущен, сама страница теперь больше не отправляется по потоку ответа и поэтому не обновляется в браузере.

Чтобы достичь того, что вам нужно после создания второго потока ответов. Самый простой способ сделать это - через новое окно браузера/всплывающее окно. Затем ваш CSV может загружаться во всплывающем окне, и ваш первоначальный ответ на страницу может оставаться в первоначальном браузере.

+0

Есть ли у вас пример кода? –

0

Просто создайте новую страницу с этим кодом на Page_Load

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() 
    Dim d As String = Format(Date.Now, "d") 
    Dim ad() As String = d.Split("/") 
    Dim fd As String = ad(0) & ad(1) 
    Dim fn As String = "E_" & fd & ".csv" 
    Response.ContentType = "text/csv" 
    Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
    CreateCSVFile(emplTable, Response.Output) 
    Response.Flush() 
    Response.End() 
End Sub 

Тогда на исходной странице, чтобы вы lblEmpl невидимыми и зарегистрировать скрипт как и открыть новое окно с CSV следующего.

var csvPageJS = string.Format("window.open ('{0}','mywindow');", ResolveUrl("~/MyCSVPage.aspx")); 
    ClientScript.RegisterStartupScript(typeof(Page), "popup", csvPageJS, true); 
+0

Я пробовал, чтобы он не работал. Он загрузит данные, но не обновит элементы управления на странице. –

+0

Я редактирую свой ответ, вы попробовали его с помощью сценария JS – alejandrobog

+0

Этот код работает некорректно. перед тем как сделать ярлык видимым, тогда откроется диалоговое окно. Хотя я сказал сделать ярлык видимым после запуска сценария. Dim csvPageJS As String = String.Format ("wi ndow.open ('{0}', 'mywindow'); ", ResolveUrl (" ~/TESTLOAD.aspx ")) ClientScript.RegisterStartupScript (GetType (Страница)," popup ", csvPageJS, True) lblRG.Visible = True –

1

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

  1. Создать seprate формы для всплывающего окна, чтобы создать CSV, переместить функцию загрузки нового page.cs и отправить ему строку запрос PARM для его dataID для экспорта.

    Protected Sub onLoad() 
        Dim recordID As Integer = Request.Querystring("dID") 
        Dim emplTable As DataTable = Nothing 
        Select Case recordID 
         case 1: emplTable = SiteAccess.DownloadEmployee_H() 
         case 2: emplTable = SiteAccess.DownloadManagers() 
        End Select 
        Response.Clear() 
        Response.ContentType = "text/csv" 
        Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
        CreateCSVFile(emplTable, Response.Output) 
        Response.Flush() 
        Response.End() 
        lblEmpl.Visible = True 
    End Sub 
    
  2. Запустите всплывающее из свойства OnClientClick кнопки, или зарегистрировать скрипт на постбэка.

    function fnPopUpCSV(expType) 
    {   
    window.open('/popUpPage.aspx?dID=' + expType,'CSVwindow', 
    'width=300,height=200,menubar=yes,status=yes, 
    location=yes,toolbar=yes,scrollbars=yes'); 
    } 
    
    <asp:Button ID="btnGenEmplCSV" runat="server" Text="Generate Employee CSV" 
    onClientClick="javascript:return fnPopUpCSV(1);" /> 
    
    <asp:Button ID="btnGenMgrCSV" runat="server" Text="Generate Manager CSV" 
    onClientClick="javascript:return fnPopUpCSV(2);" /> 
    
+0

Спасибо за вашу помощь. Можете ли вы дать мне более подробно, я не профессионал в этом. Могу ли я сделать это, чтобы добавить недостающие части? –

+0

Если у вас есть только 2 способа получения данных, которые вам не нужны, чтобы получить фантазию, я думаю. Я просто редактировал пример, чтобы поместить код в 2 кнопки и изменил функцию js, чтобы пройти через аргументы. Я также добавил ваш код выбора к серверному коду. Надеюсь, это поможет. –

+0

В вашем случае здесь я не уверен lblEmpl.Visible = True можно увидеть на главной странице. Итак, вот что я получил, если буду следовать за вами правильно. на главной странице у меня есть кнопки (7 разных csvs, 7 кнопок), например, DownloadEmployee. Я очищаю кнопку в этом событии клика, на котором запускается fnPopUp, который переходит на другую страницу и загружает, но метка находится на главной странице, а не на странице popUp, поэтому она ее не увидит. –

Смежные вопросы