I highly recommend option 2 with a slight modification. You might also want to think about creating one view model for each action / view. If you have one model that covers all pages, the check will be performed in all properties, which means that even if the user can edit part of the model only on each screen, they can receive validation warnings for properties that they do not see. We did this recently in a project, and it worked beautifully. You have to do some data manipulation in the back-end to put everything together, but it was worth it in the end.
As you said, your URLs will be interchangeable, which means that users can copy / paste, and more importantly, they can add the page as a favorite in their browser, which allows them to return to the same place very easily In my opinion, this makes option 3 obsolete.
You will also benefit from all of your navigation logic happening in one place. You will need to save the state of the "wizard" on the client (on which page you are currently on) so that your controller knows what to do when sending. You will want to analyze the state of the wizard and decide on where the user should go. If you go with option 1, you wonβt know where you came from, and server verification errors will be difficult to display to the client. This is a great example of a POST - REDIRECT - GET template. Each page will have 2 actions, GET, which accepts simple identifiers, and POST, which accepts more complex models. Send the server, find out where to go next, redirect to GET.
Finally, review the previous button by simply linking it directly to the previous step, instead of submitting the form. Otherwise, the user could potentially be stuck on an invalid step. It happened to us and again, it worked very nicely.
Hope this was helpful. Good luck
source share