Question

Je travaille sur un site Web asp.net/c#.

Je lis les données d'une base de données, en les enregistrant dans un dictionnaire

Dictionary<string, decimal> Results

puis le lier à un graphique ASP.NET

PieChart.Series["Series"].Points.DataBind(Results, "Key", "Value", string.Empty);  

Je veux changer l'étiquette d'un point lorsque je clique sur un bouton.

protected void Button_Click(object sender, EventArgs e)
{
    PieChart.Series["Series"].Points[0].Label = "abc"
}

Mais le problème lorsque je clique sur le bouton, un post-dos se produit et les données enregistrées dans le dictionnary "Results" sont perdues ainsi que le graphique.

Existe-t-il un moyen de ne pas perdre les données lorsqu'un post-back se produit sans avoir à relire à nouveau la base de données?

Merci pour toute aide.

Était-ce utile?

La solution

Oui utilisez ViewState pour préserver les données entre le post-dos.

public Dictionary<string, decimal> Results
{ 
  get { return ViewState["Results"]; }
  set { ViewState["Results"] = value; }
}

Noter:Vérifiez la valeur nul de ViewState sinon elle lancera une exception ou une erreur

Autres conseils

Certains répondants ont suggéré de stocker les données dans ViewState. Bien que ce soit personnalisé dans asp.net, vous devez vous assurer que vous comprenez absolument les implications si vous voulez emprunter cette voie, car cela peut vraiment nuire aux performances. À cette fin, je recommanderais de lire Comprendre vraiment Viewstate.

Habituellement, le stockage des ensembles de données récupérés de la base de données de ViewState nuise vraiment aux performances. Sans connaître les détails de votre situation, je risquerais de supposer que vous feriez mieux de charger les données de la base de données à chaque demande. Essentiellement, vous avez la possibilité de) sérialiser les données et envoyer les données au client (qui pourrait être sur une connexion lente) ou b) la récupération des données de la base de données, qui est optimisée pour la récupération des données et la mise en cache intelligente.

Vous pouvez mettre les données dans ViewState ou Session Pour pouvoir le retirer "de l'autre côté".

Une meilleure solution que l'utilisation du ViewState et le passage de ces données à partir du client peuvent être de créer un ID client qui est transmis dans les deux sens et de conserver un cache de ces données du côté serveur, clé par cet ID. De cette façon, vous n'avez pas besoin d'envoyer ces données du client à un serveur à chaque fois, seulement l'inverse.

Cela me semble toujours mal, mais c'est une meilleure solution que certaines des autres réponses qui impliqueraient tant de frais généraux en raison des données de rendez-vous.

En fait, puisque vous changez uniquement d'informations d'affichage et, d'après votre question, je ne pense pas que vous traitez réellement ces données, il me semble que c'est vraiment un travail pour une sorte de javascript à côté de votre Page asp.net. Je n'ai jamais fait ça, mais certains Google de base en a fait des articles à propos de ça.

Au lieu d'utiliser ViewState, pourquoi ne déplacez-vous pas votre code pour attribuer de la valeur au dictionnaire à une fonction, puis appelez cette fonction à partir de page_load à chaque post-back. De cette façon, vous ne perdrez pas de données de votre graphique.

J'utilise souvent ASP: Hiddenfield pour stocker de petites quantités de données non sécurisées côté client.

Dans la fonction page_load (), vous pouvez définir la valeur du champ caché, puis vous pouvez le lire dans des fonctions qui sont appelées ultérieurement.

Ne l'utilisez pas pour les données sécurisées car l'utilisateur du client peut effectuer une source de vue pour voir les données de la page s'il le souhaite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top