2015-05-14 5 views
11

C'è un motivo per cui la sessione ASP.NET che termina e si riavvia interferirebbe con (impedire) l'evento SelectedIndexChanged che si attiva in una lista a discesa?La fine della sessione e il riavvio impediscono a DropDownList_SelectedIndexChanged di sparare

Il modulo sta postando indietro ma il mio punto di interruzione non viene colpito?

Tutto funziona perfettamente prima del riavvio della sessione.

Ecco l'asp per il controllo:

<asp:DropDownList ID="dlSort" runat="server" AutoPostBack="true" 
        onselectedindexchanged="dlSort_SelectedIndexChanged"> 
</asp:DropDownList> 

Ecco una parte del codice:

protected void dlSort_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    PopulateItems(); 
    //Breakpoint above- not hit after session restarts, but hit prior to session end. 
} 

mi rimane una forma vuota in quanto non è sempre ripopolato ...

Grazie in anticipo,

M

Edit 1:

Ecco il codice in cui è popolato il controllo:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Form.Action = Request.RawUrl;//Required as page is rewritten 
    if (!IsPostBack) 
    { 
     SetNoItemsMessage(""); 
     PopulateSortDropDown(); 
     PopulateItems(); 
    } 
} 

private void PopulateSortDropDown() 
{ 
    clsProducts ops = new clsProducts(); 
    DataTable dt = ops.GetProductSortDropDownData(); 
    dlSortBy.DataSource = dt; 
    dlSortBy.DataBind(); 
    dlSortBy.ClearSelection(); 
    dlSortBy.SelectedValue = "1"; 
} 

Edit 2:

per chiarire, i PopulateItems() metodo popola un ripetitore di dati e dovrebbe essere eseguito sulla modifica dell'indice del menu a tendina di ordinamento (dlSort_SelectedIndexChanged) - questo non sta accadendo anche se il postback è in corso.

Page_Load esegue un metodo che popola dlSort viene sempre eseguito.

Ho esaminato la pagina estesamente e tutto ciò che non è l'evento di modifica dell'indice si attiva.

Edit 3:

void Session_Start(object sender, EventArgs e) 
{ 
    InitialiseCommonSessionVariables();//This piece of code sets default values for session variables that are used in every case. 
} 
+0

Esistono variabili di sessione utilizzate nel metodo PopulteItems()? – Mairaj

+0

Grazie, sì ci sono variabili di sessione usate ma si accede alla sessione attraverso un oggetto che controlla una sessione inizializzata prima di accedere a singole variabili. Il problema principale è che dlSort_SelectedIndexChanged non si attiva affatto dopo che la sessione è andata persa e ristabilita. – Mack

+0

Pubblica il codice che fa la popolazione iniziale del DDL. Cose che potrebbero essere rilevanti: dove è inserito il ciclo di vita della pagina (ad esempio Page_Load)? È popolato solo se IsPostBack è falso? ViewState è abilitato? I sintomi suggeriscono che il DDL non è stato inserito nel postback. – Joe

risposta

2

ho sperimentato qualcosa di simile e ha dovuto implementare una soluzione utilizzando l'evento Page_PreRender per superarla.

Nel tuo caso potresti essere in grado di verificare se PopulateItems() è già stato eseguito e se non lo si esegue in pre-rendering.

+0

Ciao @ ohoundj, ho temporaneamente implementato qualcosa di simile a questo, ma vorrei capire e superare il problema sottostante. – Mack

+0

Assegnare premi in quanto la soluzione è a posto e sembra avere successo, tuttavia sono ancora interessato alla causa principale e sarei interessato a ulteriori commenti. – Mack

0

Penso che il motivo potrebbe essere nelle impostazioni di autenticazione. Un post-back attivato dopo che la sessione è scaduta potrebbe portare a una pagina di accesso, a causa del ripristino dell'autenticazione.

E persino il reindirizzamento può essere eseguito in modo trasparente, dopo un reindirizzamento alla pagina di accesso, si perderanno tutti i parametri Post, specificati nella recente richiesta di post-back.

Ciò significa che ASP.NET non avrà modo di rilevare quale controllo ha attivato il postback (si basa sul parametro EVENTTARGET) e quindi non attiverà l'evento SelectedIndexChanged.

+0

Sto sperimentando con EVENTTARGET ora e pubblicherò i risultati dopo. – Mack

+0

Ho implementato il codice per controllare EVENTTARGET utilizzando la risposta di @ SurajSingh da questo post [collegamento] (http://stackoverflow.com/questions/20838022/eventtarget-is-empty-on-postback-of-button-click) e è davvero dlSortBy. Page_Load viene colpito quindi (senza eseguire dlSort_SelectedIndexChanged), Page_PreRender viene colpito. – Mack

+0

Sembra davvero strano, ho appena controllato un progetto pulito con lo stesso approccio, e sembra funzionare bene - l'evento viene attivato correttamente anche dopo che la sessione è scaduta. Puoi verificare se gli elementi sono compilati nel tuo caso su PageLoad al termine della sessione? – user2772146

0
  ASP.Net Code : 
     --------------- 

    <asp:DropDownList ID="ddList" runat="server" AutoPostBack="True" Height="65px" OnSelectedIndexChanged="ddList_SelectedIndexChanged" Width="198px"> 
     </asp:DropDownList> 


C# Code : 
--------- 

public void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       dropdown(); 
      } 
     } 
. 
<your code goes here> .... 

public void dropdown() 
     { 
      //String Sql statement 
      string Sqlstr = "select CountryCode,Description from ca_countryMaster order by description"; 


      string DBCon = "Data Source=RAJA;Initial Catalog=CareHMS;Integrated Security=True;"; 
      SqlConnection SqlCon = new SqlConnection(DBCon); 
      SqlCon.Open(); 

      SqlDataAdapter Sqlda = new SqlDataAdapter(Sqlstr, SqlCon); 
      DataSet ds = new DataSet(); 
      Sqlda.Fill(ds); 
      ddList.DataSource = ds.Tables[0]; 
      ddList.DataTextField = "Description"; 
      ddList.DataValueField = "CountryCode"; 
      ddList.DataBind(); 

      ds.Dispose(); 
      Sqlda.Dispose(); 
      SqlCon.Close(); 
     } 
+0

Ciao @Suttipasanga questo codice sembra compilare un elenco a discesa, questo non è il problema che sto vivendo, l'errore è che l'evento SelectedIndexChanged del menu a discesa non viene attivato sul postback dopo il riavvio della sessione. – Mack

Problemi correlati