Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP.NET/C#] Page_Load event wordt twee keer gestart!

Pagina: 1
Acties:

  • ThaLaw
  • Registratie: Maart 2001
  • Laatst online: 29-01-2021
Ik begin langzaam een beetje gek te worden, dus ik hoop dat iemand hier mij kan helpen.

Ik heb een (nog vrij eenvoudige) master en contentpage combinatie in ASP.NET 2.0

Op de contentpage een databound gridview en het enige dat ik doe is op de edit button klikken van 1 van de gridview rijen.
Vervolgens zie ik, dat Page_Load twee keer wordt gestart (1 keer IsPostback==false, de volgende IsPostback==true)

Alle forums over dit onderwerp hebben het over autoeventwireup, maar dat heb ik allemaal uit staan.
Zowel voor de masterpage als de contentpage staat autoeventwireup expliciet op false.
Ik registreer zelf de Page.Load events.

De gridview staat in een AJAX updatepanel, maar hij is er ook al uitgeweest omdat ik het probleem wilde traceren. EnableViewState voor de gridview is ook al op true en false geprobeerd, geen verschil.

Ik kom er gewoon niet achter: Waarom wordt er twee keer een page_load gefired, wanneer ik op de edit-button trap in die gridview ?!?!

(Ik heb bijv. ook nog een search-button op de page staan, die netjes 1 page_load veroorzaakt, met IsPostback==true)

  • Mozin
  • Registratie: November 2000
  • Laatst online: 04-06-2023

Mozin

Gewoon een gamer

Dat is standaard gedrag voor ASP.Net. Als er een postbackevent afgaat, wordt de pagina volledig herladen, dus gaat de init/page_load etc af met IsPostBack == false, net als je normaal zou refreshen. Maar ook de postback zelf zorgt voor een reload (in dit geval met IsPostBack == true).

Afhankelijk van performance (je wil niet 2x naar de database om data voor het grid op te halen bijvoorbeeld) en timing van je events kan je de binding van de datasource in de page_load binnen een if(!Page.IsPostBack) blok zetten.

  • ThaLaw
  • Registratie: Maart 2001
  • Laatst online: 29-01-2021
Uiteraard check ik op een IsPostback, maar het is onzin dat het standaard gedrag is dat een page bij het submitten van een form eerst als volledige pagina wordt geladen met IsPostback==false en dan nogmaals een postback doet daarna met IsPostback==true.

Alleen bij de eerste keer dat je de pagina opvraagt, hoor je een IsPostback==false te krijgen, alle andere keren dat de Page_Load event fired door een van de controls in een form hoor je volgens mij gewoon een IsPostback==true te krijgen.

Immers, de andere button op mijn page lukt het wel, die doet netjes een postback :)

Ik heb inmiddels ook wat meer info over het probleem, ik vergat te melden dat het niet de standaard GridView is op de page, maar een overridden control, dus:
code:
1
2
3
4
    public partial class PFMGridView : System.Web.UI.WebControls.GridView
    {
...
}


Ik heb net behoorlijk wat comment-out-and-run sessies achter de rug, en ben erachter wat de veroorzaker is.

Ik had o.a. de OnRowCreated method overridden:
code:
1
2
3
4
5
6
7
8
9
        protected override void OnRowCreated(GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState != DataControlRowState.Edit)
            {
                e.Row.Attributes["onclick"] = ((System.Web.UI.Page)(HttpContext.Current.Handler)).ClientScript.GetPostBackClientHyperlink(this, "Select$" + e.Row.RowIndex);
                e.Row.Style["cursor"] = "hand";
            }
            base.OnRowCreated(e);
        }


Dit was de veroorzaker van de extra postback, aangezien de edit-button in de rij staat. Ik kreeg dus eerst een postback voor het clicken van de rij blijkbaar, en toen pas voor de button.

De vraag wordt nu dus eigenlijk, is hier een oplossing voor? De edit button wordt design-time pas toegevoegd als templatefield, dat staat de gebruiker van de control vrij. Enig idee hoe ik de onclick event beperk tot alleen de databound cells?

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Heeft de gridview geen optie om rijen niet klikbaar te laten zijn?

Zo niet dan kom je in het javascript domain en moet je je event bubbling af gaan vangen.

edit: dacht dat het om een extern component ging...

[ Voor 45% gewijzigd door 4of9 op 15-04-2008 10:24 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...