2013-08-06 22 views
9

Se ho impostato sulla mia pagina: EnableViewState="true" ViewStateMode="Disabled" - Allora - il ViewState è disabilitata per la pagina (a meno che non Override ...)Perché DropDownList.SelectedValue è basato su viewstate?

Poi, cercando di leggere da (assumendo il controllo è stato popolato nel corso dell'ultimo discarica per lo schermo e un valore non è selezionato):

MyDDL.SelectedValue sarà resa ""

Questo perché disabile viewstate:

Ma la mia domanda è a un livello superiore:

  • Se è tutto su un valore modulo (che riesco ancora a ottenere da Request.Form[MyDDL.UniqueID]) - e stiamo parlando di un ingresso che non ha bisogno di tutto per salvare il suo valore

  • Perché L'alloggio DropDownList denominata (SelectedValue) viene invocato ViewState?

p.s. il TextBox onchangeevent fa affidamento su viewstate anche se il controllo è un input (che non ha bisogno di viewstate) - salva il valore del testo e poi lo confronta quando postback.Ma si basa solo su viewstate quando si imposta onchange event (e AutoPostBack)

+0

Bene il valore della casella di testo non si basa su viewstate, è possibile disabilitare viewstate e si otterrà comunque il valore della casella di testo, il suo valore deriva da IPostBackDataHandler. Request.Form [""] Funziona solo quando si inviano i dati utilizzando il metodo POST, Si consideri che un utente non è in grado di inviare un modulo a causa di errori di convalida o di qualsiasi errore con il quale il modulo non può essere pubblicato in quell'evento non è possibile ottieni i tuoi valori da Request.Form [""]. –

+0

@surajsingh Lo so già. comunque la mia domanda rimane. –

+0

Spero di essere sulla strada giusta ora, ho appena creato una lista a cascata usando listitems e mantiene lo stato anche dopo aver disabilitato ViewState. Devo ancora controllare il menu a discesa che è limitato dalle tabelle del database, vediamo se mantengono il loro stato e posso ottenere qualsiasi risposta. –

risposta

6

SOMMARIO: Se si vuole il controllo di lavorare senza ViewState, è necessario compilare/legare l'insieme di elementi su ogni postback. Consiglio di farlo nell'evento Page_Init (cioè il metodo OnInit).

Prima di tutto, ho sempre consiglio questo questo articolo impressionante: TRULY Understanding ViewState.

Il SelectedValue non richiede ViewState. Guardando il codice per ListControl, che eredita da DropDownList, vediamo il codice:

public virtual string SelectedValue 
{ 
    get 
    { 
    int selectedIndex = this.SelectedIndex; 
    if (selectedIndex >= 0) 
     return this.Items[selectedIndex].Value; 
    else 
     return string.Empty; 
    } 

La cosa importante da portare via da questo codice è che la lista dei prodotti che deve essere popolata per ottenere il SelectedValue.

Se si utilizza ViewState, la raccolta articoli è mantenuta/caricata da ViewState, che consente alla proprietà SelectedValue di funzionare senza eseguire nuovamente il controllo.

+0

Quindi è proprio come funziona. (l'implementazione di SelectedValue ....) interessante. (perchè è strano essere invocato su viewstate se ho solo bisogno del valore ...) –

7

la SelectedValue deduce ViewState perché in Postback ricostruisce sua ListItems dalla ViewState e quindi imposta il valore selezionato sul DropDownList dal Request oggetto.

Non sta prendendo direttamente il valore Request come SelectedValue. Questo a sua volta è perché, ASP.Net può controllare se il postato DropDownList non è stato manomesso dal client. Lo fa prima deserializzando gli articoli originali dal ViewState. Quindi trova il valore Request negli articoli e imposta la proprietà Selected come true. Solo ora è disponibile la proprietà SelectedValue. (o SelectedIndex per quella materia). Dovrebbe essere in grado di generare un evento SelectedIndexChanged ora.

Questo è anche il motivo per cui non è necessario associare nuovamente lo DropDownList allo PageLoad. Le voci dell'elenco vengono ritirate automaticamente da ViewState.

Se ViewState è disattivato, non ci saranno voci di elenco originali nello ViewState e sarà vuoto. Quindi non sarà in grado di contrassegnare alcun elemento come selezionato. Quindi lo SelectedValue sarà 0 o lo SelectedItem sarà nullo. Penso che l'evento SelectedIndexChanged non verrà attivato. Affinché le cose funzionino in questo caso, è necessario eseguire l'associazione dati, preferibilmente su init.

Tuttavia, ci sono soluzioni alternative.

completo Riferimento: http://msdn.microsoft.com/en-us/library/ms972976.aspx

Edit: (dopo i commenti di Op)

seguendo il ciclo di vita della pagina per vedere dove SelectedValue si basa su ViewState:

Fase 1 Init: Il controllo l'erararchia è costruita Se DropDownList è associato qui o ListItems è stato aggiunto in modo dichiarativo, la lista viene popolata qui.

Fase 2 Carica ViewState: Su PostBack, ViewState viene convalidato qui e caricato in DropDownList. C'è noSelectedValue qui.

Fase 3 Caricare dati PostBack: qui viene preso il valore Request (dalla richiesta del modulo) e quindi applicato al controllo. In questo caso di DropDownList ora set il SelectedValue dalla ricevuto Request oggetto valore, implementazione interna è qualcosa di simile:

string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id]; 
Items.FindByValue(selectedValue).Selected = true; 

Ciò che è importante qui è che se ViewState non c'è e non è DropDownList dati- associato, quindi la raccolta ListItem sarà vuota e quindi la proprietà SelectedValue è 0. Ciò non ha nulla a che fare con l'implementazione interna di una proprietà.

Se ViewState non è lì (disabilitato) e DropDownList è associato ai dati, la collezione ListItem sarà presente e l'elemento corrispondente verrà contrassegnato come selezionato e quindi la proprietà SelectedValue restituirà il valore corretto.

Se la raccolta articoli è nuova (tramite una rilegatura con set di dati diverso o ViewState è invalidata), il valore del modulo Request non verrà trovato nella raccolta articoli e nuovamente SelectedValue non sarà valido.

Fase 4 Page Load: a questo punto i dati ViewState (o data-binding) e PostBack sono già stati caricati.

Fase 5 Sollevare PostBack evento: In questa fase l'evento OnSelectedIndexChanged di DropDownList viene sparato se l'indice è stato modificato nella Fase 3.

Quindi, il SelectedValue si basa su ViewState allo stadio 3. Naturalmente, se il controllo è appropriatamente legato ai dati quindi non si affiderà a ViewState come corollario.

SelectedValue si affida a ViewState per assicurarsi che la raccolta di articoli sia stata compilata prima di impostarla. L'associazione dei dati/il re-binding è solo un altro modo per assicurarsi che la collezione di articoli sia popolata.

La speranza che chiarisce.

+0

il problema manomesso viene verificato con validationMAc. non ha nulla a che fare con il valore selezionato. –

+0

_ non sarà in grado di contrassegnare alcun elemento come selezionato, a destra. ma dovrebbe avere un valore (IMHO) come il request.form –

+0

Hai letto il riferimento che ho collegato sopra? – Abhitalks

0
 protected void Page_Load(object sender, EventArgs e) 
      { 
       (!Page.IsPostBack) 
       { 
        string qry = "SELECT TOP(5)xxx, xxxx FROM dbo.xxxxxx "; 
        DataSet ds = new DataSet(); 
        ds = SqlHelper.ExecInDS(qry); 
        drpDwn.DataSource = ds.Tables[0]; 
        drpDwn.DataValueField = Convert.ToString(ds.Tables[0].Columns["xxx"]); 
        drpDwn.DataTextField = Convert.ToString(ds.Tables[0].Columns["xxx"]);     
        drpDwn.DataBind(); 
       } 
       //Here You will get selected value from dropdown 
       string sss= Request.Form["drpDwn"]; 
    } 
0

Se si desidera che il DropDownList di lavorare senza ViewState, è possibile associare il controllo in Page_Load soltanto una volta come indicato di seguito:

 protected void Page_Load(object sender, EventArgs e) 
      {   
    //whatever you use declarative binding (in aspx page), or define data source here 
       if (!IsPostBack) 
       { 
        ddl.DataBind(); //fire databinding events and fill items, and selectedvalue has a value. 
       } 

       //you can get the selectedvalue 
       var sv=ddl.SelectedValue ; // 
      }   
  • Nel caso (ViewState è disabilitato), Asp.net FrameWork recupera gli articoli dal back-end con ogni PostBack.

  • Nel caso (ViewState è abilitato), Asp.net FrameWork recuperare gli elementi dalla ViewState senza colpire il back-end con ogni postback

Normalmente, il quadro Asp.net fuoco le associazione dati eventi in PreRender evento: Leggi ASP.NET Page Life Cycle Overview

È possibile confermare tale comportamento abilitando Traccia.

SelectedValue non si basa direttamente su ViewState da source code of ListControl, MA dipende dagli elementi come descritto sopra.