La Persistance des données à travers ASP.NET publications
Contexte:
J'ai souvent été dans des situations où nos ASP.NET pages aurait pour afficher les données de l'utilisateur sur un GridView, permettez-lui de le modifier comme il le souhaite (zone de texte sur les cellules) et à l'enregistrer dans la base de données quand il frappe le "Bouton de sauvegarde". Ces données sont généralement un état virtuel de l'information sur la page, ce qui signifie que l'utilisateur peut modifier à tout, sans vraiment d'économie d'elle jusqu'à ce qu'il frappe le "Bouton de sauvegarde".
Dans ces cas, il y a toujours la liste des données qui doivent être conservées à travers ASP.NET les Publications. Ces données pourraient être une instance d'une DataTable
ou seulement certains List<Someclass>
.
Je vois souvent des gens mettre en œuvre cette et la persistance des données sur Session
. Sur ce cas, j'ai également l'habitude de voir des problèmes quand il s'agit de l'utilisateur de naviguer avec plusieurs onglets sont ouverts, parfois sur la même page. Lorsque les données de deux onglets différents permettrait d'obtenir fusionné et causer des problèmes d'information brouillés.
Exemple de la façon dont la Session est souvent utilisé:
private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}
Souvent, les gens essaye de le résoudre en faisant quelque chose comme ceci:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}
Mais qu'en est-il de deux onglets sont déjà chargés et que l'utilisateur est en train de changer le GridView valeurs, et pour quelque étrange raison, il essaye de sauver les données en appuyant sur le bouton Enregistrer sur l'autre page? Personnellement, je n'aime pas cette option.
Autres façons de le faire serait de mettre les données sur ViewState
. Cependant, quand il s'agit de la persistance de la quasi grandes listes, auraient une incidence sur la page lourdement quand il est stocké sur la page (HiddenField
).
Mais, quelle est la meilleure façon de faire ce travail? Une fois, j'ai pensé à l'aide de Session
avec ViewState
où la ViewState
tiendrait un identifiant unique qui serait l'indice de la Session
des données enregistrées. Qui serait d'empêcher le partage des données entre les onglets du navigateur:
private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
return Session[ViewState["SomeKey"].ToString()] as List<SomeClass>;
}
set {
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
Session[ViewState["SomeKey"].ToString()] = value;
}
}
D'autre part, il serait de stocker une nouvelle liste de données de la Session à chaque fois que l'utilisateur entre dans la page. Qui aurait un impact sur la mémoire du serveur. Peut-être qu'ils pourraient être effacées d'une certaine façon.
Question:
Quelle serait la meilleure façon de la persistance de ce genre de données à travers des Publications, en considérant les contextes de plusieurs onglets dans le navigateur, avec le moindre coût pour le serveur et pour le maintien de codage de l'équipe?
Mise à jour:
@Nunespascal bien posté, une option serait de stocker les ViewState
dans le Session
à l'aide de la SessionPageStatePersister
. Mais malheureusement, ce n'est pas une option sur mon cas. Et pourtant, il n'est pas très différent de mon dernier exemple, l'enregistrement de données sur la Session indexée par un id unique stocké sur le ViewState.
Y aurait-il d'autres options?
OriginalL'auteur Mt. Schneiders | 2013-02-14
Vous devez vous connecter pour publier un commentaire.
Il existe une solution simple à ce problème. Stocker l'état d'affichage dans la Session.
Pour cela vous devez utiliser le
SessionPageStatePersister
Consulter: L'État De La Page Persister
Tout ce que vous devez faire est de remplacer le
PageStatePersister
et utiliserSessionPageStatePersister
au lieu de la valeur par défautHiddenFieldPageStatePersister
Même vous permet d'économiser des maux de tête, de maintenir une clé unique. Un champ caché sera utilisé automatiquement pour garder une clé unique, par exemple de la page.
Si je stocker sur viewstate, et de stocker le viewstate sur la session, comment pourrait-il être différent de ce dernier exemple que j'ai posté? Je veux dire, ne serait-ce pas de l'impact de la mémoire du serveur, ou comment gérer si l'utilisateur conserve l'actualisation de la page et par voie de conséquence l'enregistrement de nouvelles données à la session à chaque fois?
Oui, cela aurait un impact sur la mémoire du serveur. Mais c'est un coût que vous ne porterait même si vous avez stocké les données directement dans la session. Comme pour les répétée rafraîchit, ceux-ci vont de porc session de l'espace. Mais si vous faites face à de tels problèmes, avec la session, vous avez toujours la possibilité de se déplacer que d'une base de données. Les séances devraient finalement être purgés.
OriginalL'auteur nunespascal
J'ai rencontré une situation similaire. L'idée est que si vous permettre à de longues séances pour chaque utilisateur de modifier l'affichage de la grille, cela signifie que vous aurez également un accès concurrentiel problème parce que vous finirez par accepter seulement une dernière série de modifications à vos données.
Donc, ma solution a été, pour permettre des changements sur la base de données, mais assurez-vous que tous les utilisateurs voient le même état, via SignalR.
Maintenant, la simultanéité problème a disparu, mais vous avez encore besoin de faire des modifications à la volée. Vous pourriez souhaitez pas enregistrer les modifications, après tout. J'ai résolu ce problème en appliquant la de commande modèle de conception. Maintenant, n'importe quel ensemble de changements peuvent être approuvées ou rejetées. Chaque fois que vous vérifiez l'indice de la dernière approuvé gridview. Allez à la page de mise à jour et vous consultez la mise à jour gridview. En outre, aller à des révisions de voir de vieux approuvé gridview -un autre des avantages de la commande de conception de modèle.
OriginalL'auteur Khaled El-Tahan