2010-12-04 6 views
3

J'ai obtenu un exemple de code d'un site. une chose que je ne comprends tout simplement pas comment la valeur est ajoutée automatiquement dans ViewState.Confusion concernant la propriété C#

le code comme suit

private Dictionary<Guid, string> Names 
{ 
    get { return (Dictionary<Guid, string>)ViewState["Names"]; } 
    set { ViewState["Names"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // to keep this sample really simple, we will populate some 
     // sample data in a Dictionary and store in the viewstate 
     var names = new Dictionary<Guid, string> 
     { 
      { Guid.NewGuid(), "John" }, 
      { Guid.NewGuid(), "Smith" }, 
      { Guid.NewGuid(), "Arther" }, 
      { Guid.NewGuid(), "Hari" } 
     }; 
     //store the list in the viewstate. 
     ViewState.Add("Names", names); 

     //init grid   
    } 
} 

protected void btnAddSave_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     Names.Add(Guid.NewGuid(), txtNewName.Text);    
    } 
} 

en cas de chargement de la page Je comprends que quelques valeurs ont été ajoutées dans la collection Dictionnaire et après que toute la collection est ajouté dans ViewState nommé « noms ».

dans btnAddSave_Click événement le code Names.Add(Guid.NewGuid(), txtNewName.Text); ajoute à nouveau le nom dans la collection.

mais une chose que je ne comprends tout simplement pas comment la nouvelle valeur est ajoutée dans viewstate.

Si quelqu'un regarde private Dictionary<Guid, string> Names propriété il n'y a aucun setter donc comment automatiquement la nouvelle valeur est ajoutée dans ViewState. J'espère que ma question est claire. en un mot simple, je veux juste savoir qu'il n'y a pas de setter mais ensuite comment de nouvelles valeurs ont été ajoutées dans ViewState lorsque le code va comme Names.Add(Guid.NewGuid(), txtNewName.Text);.

automatiquement comment de nouvelles valeurs ont été ajoutées dans ViewState. car de nouvelles valeurs sont ajoutées dans la collection de dictionnaires mais aucun code n'est disponible où toutes les valeurs de dictionnaire sont ajoutées dans ViewState après avoir ajouté une valeur à la collection de dictionnaires.j'exécute le code et cela fonctionne bien. Ce code devient donc très ambigu pour moi. alors aidez-moi à comprendre comment de nouvelles valeurs sont ajoutées dans ViewState lorsque de nouvelles valeurs sont ajoutées dans la collection de dictionnaires. Merci!

Répondre

2

mise en œuvre interne de ViewState est Dictionnaire Thats pourquoi il est possible

lorsque vous accédez à

Names.Add(Guid.NewGuid(), txtNewName.Text);    

étapes impliquées

1- Obtenez le magasin de sauvegarde de la propriété représentée par les noms qui est en votre cas est ViewState ["Noms"].

voir la partie getter des noms de propriété

private Dictionary<Guid, string> Names 
{ 
**get { 
     return (Dictionary<Guid, string>)ViewState["Names"]; 
    }** 
set { ViewState["Names"] = value; }} 

Modifier, pour commentaires Thomas, je joins ma réponse

oublier le compositeur, son seul getter, maintenant, quand vous déréférencer Noms readonly propriété, le type réel derrière dereferencing est statebag et statebag implémente IDictionary, c'est pourquoi vous pouvez cast ViewState propriété à Dictionary, maintenant Lorsque vous appelez Add méthode de Dictionary, il sera stocké dans le StateBag qui est connu s ViewState de Control. donc ViewState est juste la propriété d'un contrôle, il est un type

+0

comment cela fonctionne. pouvez-vous s'il vous plaît expirer plus avec l'exemple de code. merci – Thomas

+0

j'ai fait une erreur pour donner le code. code est privé Dictionary Noms {get {return (Dictionary ) ViewState ["Noms"]; }} en fait il n'y avait pas setter donc quand Names.Add (Guid.NewGuid(), txtNewName.Text); ce code exécuté alors comment nouvelle valeur est ajoutée dans viewstate parce qu'ici j'ajoute une nouvelle valeur à dictionary.so comment le dictionnaire est ajouté viewstate parce qu'aucun setter n'est là dans property.plzz expain – Thomas

+0

oublier le setter, son seul getter, maintenant quand vous déréférenciez la propriété readonly Names, le type réel derrière dereferencing est ViewState qui est inturn un statebag et statebag implémente IDictionary, c'est pourquoi vous pouvez cast ViewState au dictionnaire, maintenant Quand vous appelez la méthode Add de Dictionary, elle sera stockée dans le StateBag qui est connu de ViewState de Control. – TalentTuner

0

Ce qui est ajouté dans le ViewState est pas le contenu du dictionnaire, mais une référence au dictionnaire. Vous pouvez toujours changer ce que le dictionnaire contient après cela.

Lorsque l'exécution de la page est terminée et qu'elle est sur le point d'être envoyée au navigateur, le contenu du dictionnaire sera sérialisé. Jusqu'à ce point, vous pouvez changer le dictionnaire, et les changements se retrouveront dans ViewState.

+0

J'ai fait une erreur pour donner le code. code est privé Dictionary Noms {get {return (Dictionary ) ViewState ["Noms"]; }} en fait il n'y avait pas setter donc quand Names.Add (Guid.NewGuid(), txtNewName.Text); ce code exécuté alors comment nouvelle valeur est ajoutée dans viewstate parce qu'ici j'ajoute une nouvelle valeur à dictionary.so comment le dictionnaire est ajouté viewstate car aucun setter n'est présent dans property.plzz expain – Thomas

+0

@Thomas: Vous n'avez pas besoin d'un setter pour changer le contenu du dictionnaire. Un setter pour cette propriété ne serait utilisé que pour remplacer le dictionnaire par un dictionnaire complètement nouveau. Vous pouvez utiliser le getter pour obtenir la référence du dictionnaire et y ajouter des éléments. – Guffa

0

La valeur de Noms.L'ajout n'est pas ajouté (directement) à l'état d'affichage. Il a été ajouté à une collection déjà dans viewstate. Avec le résultat que lorsque la collection est sérialisée, la valeur ajoutée aux noms sera sérialisée. Ceci est une question de compréhension des types de référence (un dictionnaire est)

+0

J'ai fait une erreur pour donner le code. code est privé Dictionary Noms {get {return (Dictionary ) ViewState ["Noms"]; }} en fait il n'y avait pas setter donc quand Names.Add (Guid.NewGuid(), txtNewName.Text), ce code exécuté puis comment nouvelle valeur est ajoutée dans viewstate parce qu'ici j'ajoute une nouvelle valeur à dictionary.so comment le dictionnaire est ajouté dans viewstate car aucun setter n'est présent dans property.plzz expain. – Thomas

+0

La valeur du champ de texte est ajoutée au dictionnaire qui se trouve déjà dans la collection ViewState. Rien de nouveau n'est ajouté (explicitement) à ViewState par le code Names.Add (clé, valeur) –