Qual è il modo corretto di mantenere lo stato in un controllo server personalizzato?
-
03-07-2019 - |
Domanda
Funziona, ma è il modo corretto di farlo ???
Ho un controllo server personalizzato che contiene una casella [input]. Voglio che imiti un po 'la casella di testo ASP.NET, ma non completamente. Quando viene visualizzata la casella di testo, ho un javascript che consente agli utenti di selezionare i valori che vengono quindi inseriti in quella casella di input.
Ho una proprietà di testo pubblico sul controllo. Nel get / set ottengo / imposto il viewstate per il controllo - quella parte è facile, ma quando il controllo viene popolato tramite javascript, il testo get non viene effettivamente chiamato, qual è il modo corretto di impostare questa proprietà esposta usando JavaScript (o anche se l'utente digita semplicemente nella casella)?
Modifica: In OnInit mi assicuro che lo stato venga mantenuto raggiungendo i valori del modulo.
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
{
ViewState["MyInputBoxValue"]
= HttpContext.Current.Request.Form["MyInputBoxValue"];
}
}
Quindi, per riportare il valore in realtà in HtmlTextWrite, lo faccio:
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 + ">.....
}
grazie
Soluzione
Trovo che usare IStateManager funzioni al meglio.
Ad esempio:
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 () carica semplicemente alcune impostazioni predefinite corrette in una nuova struttura di stato. state viene tracciato nel viewstate della pagina e ASP si occuperà di portarlo dentro / fuori per te.
(sopra il codice portato da VB e non controllato, speriamo di non aver fatto errori ma dovrebbe comunque ottenere il punto)
Altri suggerimenti
Se è necessario mantenere lo stato al postback, è necessario fornire i propri metodi di registrare ciò che l'utente ha fatto con il tuo controllo sul lato client e aggiornare il controllo server in un secondo momento sul server con le modifiche o ripetere le modifiche sul lato client quando la pagina viene aggiornata.
Hmm Mi chiedo se possiamo usare la persistenza ASP.NET esistente ... prova a ereditare dal controllo persistente di post-back più basilare (sto pensando asp: nascosto). Quindi sovrascrivi il rendering e aggiungi tutto il jazz che desideri.
Fammi sapere se funziona, quindi non dovrò provare :)