IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[JQuery] exporter des données au format CSV, transmettre des cookies dans une page générée dans un Iframe


Sujet :

ASP.NET

  1. #1
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut [JQuery] exporter des données au format CSV, transmettre des cookies dans une page générée dans un Iframe
    Bonjour,


    Dans ma solution, j'ai une page ASP.NET, appelons la Main.aspx.
    Cette page utilise JQuery.

    J'ai la tâche suivante à effectuer :
    J'ai un bouton qui s'appelle "exporter";
    Le but final de ce bouton est de faire un export csv de données.
    A la fin du traitement, le navigateur doit me proposer d'enregistrer un fichier au format csv.
    Comme sur la photo ci dessous ;



    Uploaded with ImageShack.us

    Pour faire cela j'utilise la technique décrite ici :
    http://encosia.com/ajax-file-downloads-and-iframes/

    En résumé quand j'appuie sur mon bouton "exporter", le traitement est le suivant :

    L'appui sur le bouton déclenche un script JQuery.
    Dans ce script :
    1) Récupérer des données
    Ces données sont des IDs. Ces IDs sont écrits dans ma page HTML.

    2) A partir des données récupérées, générer une string d'IDs avec '|' en séparateur. ex : 11|723|55|7

    3) a) Générer un objet html "iframe" dynamiquement avec jquery
    b) Associer à l'attribut "src" de cet iframe l'adresse d'une page .aspx vide (GenerateFile.aspx). Cette page existe dans ma solution. Dans l'URL, on passe également la string d'IDs.
    c) Ajouter l'iframe à la page .aspx principale (Main.aspx)

    On sort du script JQuery
    4) L'ajout de l'iframe à la page déclenche l'évènement Page_Load de la page GenerateFile.aspx.
    a) Dans cet évènement, on récupère les données transmises dans l'URL au point 3, notre chaîne d'IDs (via l'objet Request et sa propriété QueryString)
    b) On écrit dans la réponse HTTP les données du fichier csv (grâce à l'objet Response)
    c) On déclenche l'Upload du fichier csv (Response.End())

    JQuery : Évènement "clic" du bouton "exporter" de ma page "Main.aspx" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        $("#btnExport").click(function () {
            // Récupération des IDs
            var myListIDs = "";
            $("#gvDatas .lblId").each(function (index) {
                myListIDs = myListIDs + "|" + $(this).text();
            });
     
            // Création de l'iframe
            var iframe = $("<iframe id='iframeGenerateFile' class='invisible'></iframe>");
            // Définition de l'attribut 'src' de mon iframe  (rootServerUrl est une variable javascript qui contient l'adresse du serveur sur lequel je travaille)
            iframe.attr("src", rootServerUrl + "/GenerateFile.aspx?argument=" + myListIDs);
            // Ajout de l'iframe à ma page principale
            $("html body").append(iframe);
     
        });

    C# : Page_Load de ma page vide GenerateFile.aspx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                string MyArgument = Request.QueryString["argument"];
     
                Response.ClearContent();
                Response.AddHeader("content-disposition", "attachment; filename=report.csv");
                Response.ContentType = "application/vnd.ms-excel";
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
     
                string exportHeader = "ID\n";
                Response.Write(exportHeader);
     
                foreach (string s in MyArgument.Split('|').Where(s => s != string.Empty))
                {
                    Response.Write(s + "\n");
                }
     
                Response.End();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }
    Cette technique fonctionne.
    A la fin du traitement, le navigateur me propose bien d'enregistrer mon fichier au format csv.


    Ou est le problème et où interviennent les cookies ?
    Et bien dans la technique présentée ci dessus, ma chaîne d'IDs est transmise au Page_Load de GenerateFile.aspx via l'URL.
    Je travaille avec le navigateur IE9, et pour ce navigateur, la limite de caractères que je peux passer dans l'URL est 2000 et quelques caractères.
    Au dessus, ça fonctionne plus.
    http://www.boutell.com/newfaq/misc/urllength.html


    Mon problème ici est de transmettre les données,
    du javascript de ma page Main.aspx
    jusque dans l'évènement Page_Load de ma page GenerateFile.aspx,
    sans la limitation des 2000 caractères.


    Par variable de session, c'est pas possible, car il est impossible de modifier une variable de session (serveur) dans du code javascript/jQuery (client).

    Une autre option, serait d'appeler une méthode Ajax JQuery qui sauvegarderait les IDs directement dans une base de données.
    Je me réserve cette solution si vraiment je ne trouve rien d'autre.

    J'ai donc pensé aux cookies.
    Mon but est de passer ma chaîne d'IDs, non plus par l'URL mais par des cookies
    Un cookie a aussi une limite max de données je pense, mais l'avantage est que je peux en créer plusieurs si nécessaire.


    J'ai trouvé un plugin Jquery que j'ai installé pour générer et gérer des cookies.
    http://plugins.jquery.com/project/Cookie
    L'utilisation de ce plugin dans le code JQuery est très très simple :
    http://www.point2zero.net/blog/2009/...cookie-plugin/

    Voici le nouveau code JQuery avec l'utilisation de cookie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        $("#btnExport").click(function () {
     
            var myListIDs = "";
            $("#gvDatas .lblId").each(function (index) {
                myListIDs = myListIDs + "|" + $(this).text();
            });
     
            $.cookie("myCookie1", myListIDs);
            alert($.cookie("myCookie1"));
     
            var iframe = $("<iframe id='iframeGenerateFile' class='invisible'></iframe>");
            iframe.attr("src", rootServerUrl + "/GenerateFile.aspx");
            $("html body").append(iframe);
     
        });
    Mon cookie est bien créé correctement puisque que j'arrive à voir sa valeur lors de l'alert javascript.

    Par contre je n'arrive pas à la récupérer le cookie dans l'évènement Page_Load de GenerateFile.aspx.
    Dans cet évènement, lorsque je fait
    je n'ai pas mon cookie "myCookie1" dans la collection.

    Pourquoi ? Comment faire pour le récupérer ? Est ce possible ?
    Est ce une histoire de domaine pour le cookie ?
    http://www.electrictoolbox.com/cookies-and-domains/
    Merci de votre aide.

  2. #2
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    J'aimerais apporter une précision :

    Quand je crée un cookie dans le Page_Load de ma page "Main.aspx", contenant mon bouton "exporter" (donc création du cookie côté serveur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        protected void Page_Load(object sender, EventArgs e)
        {
            HttpCookie a_cookie = new HttpCookie("CookieTest");
            a_cookie["CookieTest"] = "une valeur de test";
            Response.Cookies.Add(a_cookie);
        }
    j'arrive bien à le retrouver dans la collection de cookies, dans le Page_Load de la page "GenerateFile.aspx" quand je fais :
    Request.Cookies;


    Mon problème est que moi, je crée le cookie dans le javascript/JQuery de la page "Main.aspx". (donc côté client).
    Et quand je le crée de cette façon, je ne le retrouve pas dans le Page_Load de "GenerateFile.aspx" (alors que le cookie existe dans le navigateur car j'arrive à l'afficher en utilisant la fonction alert de javascript et je peux le voir aussi dans le code JQuery quand je fais document.cookie;)

  3. #3
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    Pour que les cookies créés dans le navigateur client persistent,
    il faut les créer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $.cookie('the_cookie', 'the_value', { path: '/' });
    De cette façon, je les retrouve dans ma page "GenerateFile.aspx" ...

    Quelques astuces que je peux donner après avoir travaillé sur les cookies :

    1) Les cookies créés avec le plugin jquery semblent limités en nombre de caractères.
    Je sais pas trop si ça dépend du navigateur, mais dans mon cas, j'ai mis une limite à 4000 caractères / cookie.

    lorsque j'essaye de mettre une chaîne de caractères de longueur trop importante dans un cookie, lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert($.cookie("the_cookie"));
    en jscript, cela affiche NULL.

    2) je 'clear' toujours mes cookies avant de les réutiliser.
    Pour ce faire, il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $.cookie('the_cookie', null, { path: '/' });
    PS : A un admin, pouvez vous éditer mon titre ? Mettre un truc du style :
    "JQuery/ASP.NET : exporter des données au format CSV, transmettre des cookies dans une page générée dans un Iframe"
    Je pense que ça peut servir à d'autres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importer des données au format csv
    Par 7ider5 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/10/2012, 17h37
  2. Réponses: 4
    Dernier message: 24/08/2011, 18h23
  3. Recherche des données dans une BD ou dans une List
    Par mesken dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2011, 16h45
  4. Export de données sous format csv
    Par matriyouchka1971 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/09/2009, 17h48
  5. [MySQL] recuperation des données d'un BD et les affichées ds une page html
    Par moonia dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 21/04/2006, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo