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 usespreviouspage
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
Post a Comment