2010-05-12 8 views
3

S'il vous plaît jeter un oeil à l'événement, cliquez ci-dessous ...Obliger A Postback 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 

Ce code exporte simplement à partir d'une datatable données dans un fichier csv. Le problème ici est lblEmpl.Visible = true ne sera jamais atteint car ce code ne provoque pas de publication sur le serveur. Même si je place la ligne de code lblEmpl.Visible = true en haut de l'événement click, la ligne s'exécute correctement, mais la page n'est jamais mise à jour. Comment puis-je réparer cela?

+0

Vous êtes en cours d'exécution dans le même problème que ce poste: http://stackoverflow.com/questions/2731971/problem-clearing-text-fields-on-vb-net-project-vs2008/2732657 # 2732657 –

Répondre

4

Cette ligne:

lblEmpl.Visible = True 

jamais fait frapper parce que cette ligne:

Response.End() 

Lance une ThreadAbortException

Je pense que d'une manière plus propre à gérer est de créer un simple composant HttpHandler et "ouvrez-le" dans une fenêtre contextuelle. (Dans la plupart des cas, le navigateur se rend compte qu'il s'agit en réalité d'un téléchargement et supprime l'onglet/la fenêtre.)

Recherchez l'interface IHttpHandler. Ils sont en réalité assez simples à mettre en œuvre.

Voici un exemple de gestionnaire. Désolé il a fallu un certain temps, je me suis appelé à une réunion:

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, essayez d'ajouter un événement onclick javascript pour déclencher le téléchargement:

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

L'événement OnClick régulier feu de votre code postback. L'événement javascript onclick (OnClientClick) lancera le téléchargement via le HttpHandler.

+0

Que faire si je ne mets pas la ligne Response.End là quel sera l'effet. Y a-t-il un inconvénient? –

+0

Même si je commente la ligne Response.End, cela ne fonctionne toujours pas. –

+0

Im recherche sur le net et je ne suis pas sûr de ce que vous voulez dire. Je n'ai jamais utilisé HttpHandler avant. Pouvez-vous me montrer un bon exemple? –

1

Vous envoyez le fichier CSV dans le flux de réponses, puis vous le terminez. Par conséquent, une fois que tout votre code a été exécuté, la page elle-même n'est plus envoyée dans le flux de réponses et n'est donc pas mise à jour dans le navigateur.

Afin de réaliser ce que vous êtes après avoir besoin de créer un deuxième flux de réponse. La manière la plus simple de le faire est de passer par une nouvelle fenêtre de navigateur/popup. Ensuite, votre fichier CSV peut être téléchargé dans la fenêtre contextuelle et votre réponse de page initiale peut rester dans le navigateur initial.

+0

Avez-vous un échantillon de code de cela? –

0

il suffit de créer une nouvelle page avec ce code sur 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 

ensuite sur votre page originale vous faire lblEmpl invisible et enregistrer un script comme suit pour ouvrir une nouvelle fenêtre avec votre csv.

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

J'ai essayé que cela ne marche pas.Il va télécharger les données, mais pas actualiser les contrôles sur la page –

+0

Je édite ma réponse, l'avez-vous essayé avec le script JS – alejandrobog

+0

Ce code fonctionne un peu, le seul problème est qu'il met à jour le La page avant de rendre l'étiquette visible ouvre la boîte de dialogue, même si j'ai dit de rendre l'étiquette visible après l'exécution du script. ndow.open ('{0}', 'mywindow'); ", ResolveUrl (" ~/TESTLOAD.aspx ")) ClientScript.RegisterStartupScript (GetType (Page)," popup ", csvPageJS, True) lblRG.Visible = True –

1

Vous devriez aller avec une fenêtre contextuelle afin que vous puissiez toujours définir votre étiquette sur la page d'origine. D'après ce que je vois que vous pourriez faire quelque chose comme ça

  1. Créer un formulaire seprate pour le pop-up pour créer le CSV, déplacez votre fonction à la charge des nouveaux page.cs et envoyer un parm querystring pour son ID de données à exporter.

    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. Lancez votre pop-up de la propriété OnClientClick du bouton ou enregistrer un script sur le postback.

    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

Merci pour votre aide. Pouvez-vous me donner plus de détails? Je ne suis pas un professionnel en la matière. Est-ce que je ferais ceci pour ajouter les morceaux manquants? Dim emplTable As DataTable =Nothing Select Case recordID case 1: emplTable = SiteAccess.DownloadEmployee_H() case 2: emplTable = SiteAccess.DownloadManagers() End Select

+0

Si vous avez seulement 2 méthodes pour obtenir les données que vous n'avez pas besoin d'avoir envie, je suppose. J'ai juste édité l'exemple pour mettre le code dans 2 boutons et changé la fonction de js pour passer par les args. J'ai ajouté votre cas de sélection au code du serveur aussi. J'espère que cela pourra aider. –

+0

Dans votre cas ici, je ne suis pas sûr que lblEmpl.Visible = True peut être vu par la page principale. Alors voici ce que j'ai si je vous suis correctement. sur la page principale j'ai des boutons (7 différents csvs, 7 boutons) appelés DownloadEmployee par exemple. Je clique sur le bouton dans cet événement de clic il exécute fnPopUp qui va à une autre page et télécharge, mais l'étiquette est sur la page principale pas la page de pop-up ainsi elle ne le verra pas. –