tags:

views:

91

answers:

6

I have a page that requires the user to go through several steps, however step is performed on the same ASPX page with different panels being displayed.

However this is a requirement that each step has a different URL, this could be a simple as a query string parameter, for example:

Step 1: /member/signup.aspx?step=1

Step 2: /member/signup.aspx?step=2

Step 3: /member/signup.aspx?step=3

However I don't want to have to redirect the user to the new URL each time they continue to the next step, this would involve a lot of redirecting and also a switch statement on the page load to work out which step the user is on.

It would be better if I could alter the URL that is displayed to the user when the original request is sent back to the user, i.e. the user click "next" on step 1 the page then does some processing and then alters response so that the user then sees the step 2 URL but without any redirection.

Any ideas would be greatly appreciated.

A: 

Check out server.transfer

Andrew
Server.Transfer is no different than a Response.Redirect for what he wants.
Joel Etherton
A: 

It would be a little more complicated than you probably want, but you could achieve this effect with the PostBackUrl property of the submitting button. I'm assuming each panel has its own "submit" button, and they could all use this property to "advance" the process. The drawback is that in order to get to submitted controls, you'd need to use the Page.PreviousPage property in order to access any controls and their values.

Joel Etherton
A: 

You could programmatically alter the PostbackUrl property of your 'Next' button on each Page_Load, based on the query string value. This is a bit strange though, as you wouldn't be able to use a standard event handler for the button click, and you'd have to use the PreviousPage property of the Page to get the data from the previous tab.

I'd say challenge this requirement. Why would anyone need to jump into the middle step? If it's a case of displaying the progress to the user, do this on the page, not in the URL.

Graham Clark
+2  A: 

Could you convert your Panels into steps in a Wizard control?

PhilPursglove
A: 

You require that each step has different URL, than Response.Redirect is the only option. As you want to avoid the redirection, you can use IFrame but IFrame URL is not visible to user on his browser. I think redirect option is ugly(for both SERVER and CLIENT) as in this case, you first post on the page and than get that page. The best solution is POST BACK with some varible tracking step.

Adeel
A: 

You could implement a form or url rewriting so that your urls end up being

/member/signup/step1/

/member/signup/step2/

/member/signup/step3/

To do this use the

HttpContext.RewritePath method which means you can rewrite /member/signup/step1/ to /member/signup.aspx?step=1 for example. See an example here.

I would also use the PRG (post request get) pattern so that each next link posts the form data of that step to the session then redirects the user top the correct next url. this will ensure that the user can navigate back and forth through the steps safely and also the url will remain intact in all your posts.

Sheff