2008-10-21 12 views
1

Cela fonctionne, mais est-ce la bonne façon de le faire ???Quelle est la bonne façon de maintenir l'état dans un contrôle de serveur personnalisé?

J'ai un contrôle de serveur personnalisé qui a une boîte [entrée] sur elle. Je veux imiter le TextBox ASP.NET, mais pas complètement. Lorsque la zone de texte est rendue, j'ai un javascript qui permet aux utilisateurs de sélectionner les valeurs qui sont ensuite placées dans cette boîte de saisie.

J'ai une propriété de texte publique sur le contrôle. Dans le get/set j'obtiens/mets le viewstate pour le contrôle - cette partie est facile, mais quand le contrôle est rempli via le javascript, le Text get n'est pas réellement appelé, quelle est la bonne façon de définir cette propriété exposée en utilisant JavaScript (ou même si l'utilisateur tape simplement dans la boîte)?

Editer: Dans l'OnInit, assurez-vous que l'état est maintenu en accédant aux valeurs du formulaire.

protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "") 
     { 
      ViewState["MyInputBoxValue"] 
       = HttpContext.Current.Request.Form["MyInputBoxValue"]; 
     } 
    } 

ensuite pour obtenir la valeur réellement en place dans le HtmlTextWrite, je fais ceci:

protected override void RenderContents(HtmlTextWriter output) 
{ 

     // There is an input control here and i set its value property 
     // like this using the Text internal defined. 
     output.Write("<input value=" + Text + ">..... 

} 

grâce

Répondre

1

Je trouve qu'IStateManager fonctionne le mieux.

Par exemple:

partial class MyControl : System.Web.UI.UserControl, IStateManager 
{ 
    [Serializable()] 
    protected struct MyControlState 
    { 
     public bool someValue; 
     public string name; 
    } 

    protected MyControlState state; 

    public bool someValue { 
     get { return state.someValue; } 
     set { state.someValue = value; } 
    } 

    public bool IsTrackingViewState { 
     get { return true; } 
    } 

    protected override void LoadViewState(object state) 
    { 
     if ((state != null) && state is MyControlState) { 
      this.state = state; 
     } 
    } 

    protected override object SaveViewState() 
    { 
     return state; 
    } 

    protected override void TrackViewState() 
    { 
     base.TrackViewState(); 
    } 
} 

getDefaultState() serait tout simplement charger certains paramètres par défaut sains d'esprit dans une nouvelle structure de l'État. l'état est suivi dans le viewstate de la page, et ASP se chargera de le faire entrer/sortir pour vous.

(code ci-dessus porté de VB et non vérifié, je l'espère je ne faisais pas des erreurs mais il devrait obtenir le point à travers toute façon)

+0

Cela a fonctionné comme un champion, en particulier il y a une valeur que je devais régler pour vérifier si l'article était sale: si (! ((IDictionary) _viewstate) .Contains ("CustomValue") || _viewstate.IsItemDirty ("CustomValue")) – schmoopy

+0

Dans votre méthode 'LoadViewState()', vous annulez le paramètre entrant 'state' en l'écrasant avec le retourne la valeur de 'getDefaultState()'. Est-ce intentionnel? –

+0

@ChrisWalsh Non, et en regardant cela 7 ans plus tard, je ne sais pas pourquoi cela serait même là, ou de quelle base de code cela est originaire. J'ai enlevé cette ligne, ce qui semble avoir du sens pour moi maintenant (mais attention, je n'ai pas fait ASP WebForms depuis au moins 5 ans). Merci de l'avoir signalé. – gregmac

0

Si vous avez besoin de maintenir l'état sur postback, vous devez fournir votre propre méthodes d'enregistrement de ce que l'utilisateur a fait avec votre contrôle sur le côté client et soit mettre à jour le contrôle du serveur plus tard sur le serveur avec les changements, ou refaire les changements sur le côté client lorsque t La page se rafraîchit.

0

Hmm Je me demande si nous pouvons utiliser la persistance de ASP.NET existante .. essayez d'hériter du contrôle persistant de l'état post-retour le plus basique (je pense asp: hidden). Ensuite, remplacez simplement le rendu et ajoutez tout le jazz que vous voulez.

Laissez-moi savoir si cela fonctionne, alors je ne veux pas tester :)