c# - Difference between "normal postback" and "page creation as PreviousPage" -


there 2 scenarios asp.net webforms page differentiate between: "normal postback" , when page created because next page has called previouspage.

  • a normal posback occured page 1
    • ispostback true
    • iscrosspagepostback false

and

  • there server.transfer("page2.aspx") page 2, , page 2 uses previouspage page 1 created virtually. page 1:
    • ispostback true
    • iscrosspagepostback false

you can see ispostback , iscrosspagepostback not because same in both cases.

the reason why asking this:

i have page 1 sends data page 2 via cross-page postback (postbackurl="page2.aspx" set in page 1). users have javascript enabled, works fine.

but wanted fallback users have javascript disabled. them, click on submit button on page 1 not lead page 2 postback page 1. page 1 detect , server.transfer("page2.aspx") page 2. problem is: when page 2 uses previouspage page 1 created again , server.transfer() again , again , again ...

my workaround server.transfer not in page_load event in page_prerender event because event occur when normal postback , not when page created previouspage.
workaround works dirty. if differentiate between 2 scenarios in page_load event, better.

is possible?

when httpserverutility.transfer page 1 page 2, httpcontext shared between page 1 , page 2. normally, 1 request means 1 request handler (usually page) , 1 request context. in case there's 2 handlers , 1 (shared) context. can use context share information request between 2 handlers.

so 1 solution may page 1 puts data page 2 needs in httpcontext.items. page 2 first checks data. if present, page 2 knows control transferred way of server.transfer , should not call on page 1 through previouspage. instead should data context.

page1.aspx

protected void page_load(object sender, eventargs e) {     if(ispostback && httpcontext.items.contains("crosspagepostback") == false)     {        // cross page postback did not succeed (javascript disabled)        string name = nametextbox.text;        httpcontext.items.add("name", name);         httpcontext.items.add("transfer", true);        server.transfer("page2.aspx");     } } 

page2.aspx

protected void page_load() {     if(ispostback)     {         string name;         if(crosspagepostback)         {             // cross page postback succeeded (javascript enabled)             httpcontext.items.add("crosspagepostback", true);             name = previouspage.nametextbox.text;         }         else if (httpcontext.items.contains("transfer"))         {             // got transferred page1.aspx             name = (string)httpcontext.items["name"];         }          // page 1's form value(s)     } } 

or can turn around , let page 2 add mark ("page 2 here") httpcontext.items, , page 1 checks mark. if it's present doesn't need transfer again (break loop). i'm not 100% sure if call previouspage results in shared request context.

page1.aspx

protected void page_load(object sender, eventargs e) {     if(ispostback && httpcontext.items.contains("crosspagepostback") == false)     {         // cross page postback did not succeed (javascript disabled)        if(httpcontext.items.contains("transfer"))        {            // did not yet transfer page 2            httpcontext.items.add("transfer", true);            server.transfer("page2.aspx");        }     } } 

page2.aspx

protected void page_load() {     if(ispostback)      {                 if(crosspagepostback)         {             // cross page postback succeeded (javascript enabled)             httpcontext.items.add("crosspagepostback", true);         }          string name = previouspage.nametextbox.text;          // page 1's form value(s)     } } 

the second method simpler in implementation, if form on page 1 complex. you'd have 1 place read page 1's form, , add simple boolean httpcontext.items.


Comments