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?

La deuxième approche est réalisable avec un peu de bricolage: 1) l'utilisation d'un champ caché plutôt que de ViewState. Cela vous permet d'y accéder avant d'état d'affichage n'est disponible sur la page (utile parfois). 2) Synthèse de la Session avec un gestionnaire qui limite la façon dont beaucoup d'articles peuvent être stockées à la fois et jette les éléments les plus anciens. Bien sûr, cela ne permet pas de résoudre totalement le problème de mémoire, mais peut aller un long chemin vers la permettant aux utilisateurs de travailler de façon organique dans votre application sans se soucier d'une longue utilisateur aura des centaines de grands objets/jeux en mémoire.

OriginalL'auteur Mt. Schneiders | 2013-02-14