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.