2009-12-31 4 views
1

Je construis une application asp.net MVC 2.Etat de stockage dans asp.net MVC

J'ai une vue en liste qui liste les éléments en fonction d'un paramètre. Dans la base de données, j'ai une table parent et enfant, donc ma vue liste liste tous les enregistrements enfants pour lesquels l'id du parent correspond à la valeur spécifiée dans le paramètre.

Ceci est mon contrôleur et le modèle:

public ActionResult List(int ParentID) 
{ 
    return View(new Models.ChildListModel(ParentID)); 
} 

public class ChildListModel 
{ 
    public int ParentID {get;set;} 

    public ManagementUserListModel(int iParentID) 
    { 
     this.ParentID = iParentID; 
     this.Children = DataAccessLayer.ListChildrenForParent(iParentID); 
    } 

    public List<Child> Children {get;set;} 
} 

J'ai aussi des détails et de créer une action pour ce contrôleur. Les détails et la vue de création ont une action "retour à la liste", que je veux revenir à la vue de liste, et maintenir l'original ParentID. Jusqu'à présent, je l'ai fait en créant un champ caché appelé ParentID dans la liste, modifier, créer et détails des vues, de sorte que la propriété ParentID du modèle se remplis correctement:

<%= Html.HiddenFor(model => model.ParentID) %> 

Ensuite, dans le « Retour à liste » action dans chaque vue je passe le ParentID:

<%=Html.ActionLink("Back to List", "List", new {ParentID = Model.ParentID}) %> 

tout cela fonctionne, mais je ne suis pas un grand fan de stockage ID premières dans le code HTML. Y a-t-il de meilleurs moyens de le faire? Y a-t-il un moyen de crypter les données (un peu comme le standard asp.net viewstate?) J'essaie juste d'obtenir une sorte de résistance à l'altération, et d'essayer d'éviter d'utiliser l'état de session (TempData, etc.) ne veulent pas avoir à gérer les délais d'attente de session.

+0

ViewState était codé en base64, et assez facile à 'déchiffrer'. Je suppose que la question est, pourquoi ne pas utiliser les ID de magasin dans le brut? Quels problèmes y a-t-il avec cela? –

Répondre

8

Vous pouvez consulter ce article. Vous pouvez utiliser la nouvelle méthode d'extension Html.Serialize dans votre vue qui vous permet de sérialiser des objets entiers et chiffrez:

<%= Html.Serialize("person", Model, SerializationMode.Encrypted) %> 

qui sérialise le modèle dans un champ caché et encrypte la valeur. Pour obtenir le modèle de retour que vous utilisez le DeserializeAttribute dans l'action du contrôleur auquel le formulaire est soumis:

public ActionResult Edit([Deserialize]Person person) { } 
0

La façon la plus simple serait de garder le parentid dans l'URL. Cela va sembler un peu étrange pour Create Action mais je pense toujours que c'est le moins gênant.

Si vous gardez l'état, vous aurez toujours le problème que vous ne pouvez pas appuyer sur F5 et vous ne pouvez pas mettre en signet la page.

Le backlink est un simple ActionLink dans ce cas.

urls seraient:

/YourController/Liste/YourParentParameterValue

/YourController/Détail/YourParentParameterValue/YourDetailParameterValue

/YourController/Créer/YourParentParameterValue

2

Une autre façon de le faire que n'expose pas l'ID et n'ajoute pas non plus au poids du post de formulaire suivant (comme le fait ViewState de Webform et Html.Serialize le ferait) est d'utiliser la session comme backing st minerai dans votre classe Model.

public class ChildListModel 
{ 
    public int ParentID { 
     get 
     { 
      return (int)HttpContext.Current.Session["ChildListModel.ParentID"]; 
     } 
     set 
     { 
      HttpContext.Current.Session["ChildListModel.ParentID"] = value; 
     } 
    } 

    public ManagementUserListModel(int iParentID) 
    { 
     this.ParentID = iParentID; 
     this.Children = DataAccessLayer.ListChildrenForParent(iParentID); 
    } 

    public List<Child> Children {get;set;} 
} 

Si vous le souhaitez, vous pouvez même stocker l'ensemble de l'objet parent dans votre modèle de cette façon au lieu de simplement son ID - qui ajouterait à la taille de la session sur le serveur qui peut ou peut ne pas être souhaitable (selon combien de temps dure votre session et si elle est configurée pour être stockée en mémoire ou dans un serveur SQL, etc.)

+0

oups, n'a pas vu cela "et en essayant d'éviter d'utiliser l'état de session" à la fin de la question initiale. Je pense toujours que ce qui précède sera probablement utile pour certaines personnes qui lisent ce fil, alors je vais le laisser. – Thinginab