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

È stato utile?

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 :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top