What is the “best” way to handle alternately Post and Get Actions?












1















I am trying to build sth pretty simple, but I try to do it the correct way. But I struggle to figure out what is best.



I have a process chain where the user has to fill in some fields in different forms. Sometimes it depends from the user inputs which form the user is shown next.



[HttpGet]
public IActionResult Form1(Form1Vm f1vm)
{
return View(f1vm);
}


[HttpPost]
[ActionName("Form1")]
public IActionResult Form1Post(Form1Vm f1vm)
{
//process the data etc
//prepare the new viewmodel for the next form view (f2vm)

//Option1:
return View("Form2", f2vm);

//Option2:
return RedirectToAction("Form2", f2vm);
//for Option 2 I would need an additional HttpGet Action Method in which I
//would have to call Modelstate.Clear(); in order to not have the
//immediate validation errors on page load
//also all the properties of my viewmodel are passed as get parameters
//what looks pretty nasty for me
}

//More form views action methods should be added here...:


What is the better way? As mentioned in my comments above I have quite a big disadvantage for using the RedirectToAction option. However if I use the direct View(); call, I don't take care on https://en.wikipedia.org/wiki/Post/Redirect/Get and the user cannot simply refresh a page without getting a warning that his form is submitted once again.



Do I miss another way or don't see something obvious?



Edit: I just thought about a 3rd way, which I have seen quite often: Not transfering the whole VM to a HttpGet method but only the ID. I'd then have to load all the data stored previously directly from the db, map it again to my new VM and then call the View(); with this VM. Right now I think this is the "best" solution, however I feel like it is pretty laborious...










share|improve this question

























  • Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

    – eVolve
    Jan 3 at 21:00











  • Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

    – misanthrop
    Jan 4 at 6:41


















1















I am trying to build sth pretty simple, but I try to do it the correct way. But I struggle to figure out what is best.



I have a process chain where the user has to fill in some fields in different forms. Sometimes it depends from the user inputs which form the user is shown next.



[HttpGet]
public IActionResult Form1(Form1Vm f1vm)
{
return View(f1vm);
}


[HttpPost]
[ActionName("Form1")]
public IActionResult Form1Post(Form1Vm f1vm)
{
//process the data etc
//prepare the new viewmodel for the next form view (f2vm)

//Option1:
return View("Form2", f2vm);

//Option2:
return RedirectToAction("Form2", f2vm);
//for Option 2 I would need an additional HttpGet Action Method in which I
//would have to call Modelstate.Clear(); in order to not have the
//immediate validation errors on page load
//also all the properties of my viewmodel are passed as get parameters
//what looks pretty nasty for me
}

//More form views action methods should be added here...:


What is the better way? As mentioned in my comments above I have quite a big disadvantage for using the RedirectToAction option. However if I use the direct View(); call, I don't take care on https://en.wikipedia.org/wiki/Post/Redirect/Get and the user cannot simply refresh a page without getting a warning that his form is submitted once again.



Do I miss another way or don't see something obvious?



Edit: I just thought about a 3rd way, which I have seen quite often: Not transfering the whole VM to a HttpGet method but only the ID. I'd then have to load all the data stored previously directly from the db, map it again to my new VM and then call the View(); with this VM. Right now I think this is the "best" solution, however I feel like it is pretty laborious...










share|improve this question

























  • Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

    – eVolve
    Jan 3 at 21:00











  • Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

    – misanthrop
    Jan 4 at 6:41
















1












1








1








I am trying to build sth pretty simple, but I try to do it the correct way. But I struggle to figure out what is best.



I have a process chain where the user has to fill in some fields in different forms. Sometimes it depends from the user inputs which form the user is shown next.



[HttpGet]
public IActionResult Form1(Form1Vm f1vm)
{
return View(f1vm);
}


[HttpPost]
[ActionName("Form1")]
public IActionResult Form1Post(Form1Vm f1vm)
{
//process the data etc
//prepare the new viewmodel for the next form view (f2vm)

//Option1:
return View("Form2", f2vm);

//Option2:
return RedirectToAction("Form2", f2vm);
//for Option 2 I would need an additional HttpGet Action Method in which I
//would have to call Modelstate.Clear(); in order to not have the
//immediate validation errors on page load
//also all the properties of my viewmodel are passed as get parameters
//what looks pretty nasty for me
}

//More form views action methods should be added here...:


What is the better way? As mentioned in my comments above I have quite a big disadvantage for using the RedirectToAction option. However if I use the direct View(); call, I don't take care on https://en.wikipedia.org/wiki/Post/Redirect/Get and the user cannot simply refresh a page without getting a warning that his form is submitted once again.



Do I miss another way or don't see something obvious?



Edit: I just thought about a 3rd way, which I have seen quite often: Not transfering the whole VM to a HttpGet method but only the ID. I'd then have to load all the data stored previously directly from the db, map it again to my new VM and then call the View(); with this VM. Right now I think this is the "best" solution, however I feel like it is pretty laborious...










share|improve this question
















I am trying to build sth pretty simple, but I try to do it the correct way. But I struggle to figure out what is best.



I have a process chain where the user has to fill in some fields in different forms. Sometimes it depends from the user inputs which form the user is shown next.



[HttpGet]
public IActionResult Form1(Form1Vm f1vm)
{
return View(f1vm);
}


[HttpPost]
[ActionName("Form1")]
public IActionResult Form1Post(Form1Vm f1vm)
{
//process the data etc
//prepare the new viewmodel for the next form view (f2vm)

//Option1:
return View("Form2", f2vm);

//Option2:
return RedirectToAction("Form2", f2vm);
//for Option 2 I would need an additional HttpGet Action Method in which I
//would have to call Modelstate.Clear(); in order to not have the
//immediate validation errors on page load
//also all the properties of my viewmodel are passed as get parameters
//what looks pretty nasty for me
}

//More form views action methods should be added here...:


What is the better way? As mentioned in my comments above I have quite a big disadvantage for using the RedirectToAction option. However if I use the direct View(); call, I don't take care on https://en.wikipedia.org/wiki/Post/Redirect/Get and the user cannot simply refresh a page without getting a warning that his form is submitted once again.



Do I miss another way or don't see something obvious?



Edit: I just thought about a 3rd way, which I have seen quite often: Not transfering the whole VM to a HttpGet method but only the ID. I'd then have to load all the data stored previously directly from the db, map it again to my new VM and then call the View(); with this VM. Right now I think this is the "best" solution, however I feel like it is pretty laborious...







asp.net post get asp.net-core-2.0 actionmethod






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 31 '18 at 14:20







misanthrop

















asked Dec 31 '18 at 14:02









misanthropmisanthrop

27515




27515













  • Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

    – eVolve
    Jan 3 at 21:00











  • Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

    – misanthrop
    Jan 4 at 6:41





















  • Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

    – eVolve
    Jan 3 at 21:00











  • Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

    – misanthrop
    Jan 4 at 6:41



















Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

– eVolve
Jan 3 at 21:00





Does form2 need values from form1? Or are you building up a model as you go along? You could save form1 values to session on the post then redirect to a get for form2. Once you get to the end of the all the forms you can get the form values form session.

– eVolve
Jan 3 at 21:00













Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

– misanthrop
Jan 4 at 6:41







Yes in some cases I need data from previous forms and for your other idea I'd say: It depends but in most of my scenarios I need to store the data not in a session but permanent, so that no data isn't lost when the browser is closed or the user navigates (by accident) somewhere else...

– misanthrop
Jan 4 at 6:41














1 Answer
1






active

oldest

votes


















1














As per the dicussions, I would suggest using depending on your preference :



1) Save to db at the end of each form post and as you suggested use the I'd to redirect to a GET.
2) Depending on the the number of form pages and your requirements, retrieving values that a form needs on the get would be standard practice. This ensures that if a user drops off a form at any stage you can then start them off where they left off.
3) I wouldn't setup the viewmodel for the next form in the post of the previous. Generally as part of the single responsibility principle you want to ensure that your methods have only one reason to change.
4) PostRedirectGet pattern should be implemented with this to ensure data is not saved multiple times if a user refreshes after a post.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988322%2fwhat-is-the-best-way-to-handle-alternately-post-and-get-actions%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    As per the dicussions, I would suggest using depending on your preference :



    1) Save to db at the end of each form post and as you suggested use the I'd to redirect to a GET.
    2) Depending on the the number of form pages and your requirements, retrieving values that a form needs on the get would be standard practice. This ensures that if a user drops off a form at any stage you can then start them off where they left off.
    3) I wouldn't setup the viewmodel for the next form in the post of the previous. Generally as part of the single responsibility principle you want to ensure that your methods have only one reason to change.
    4) PostRedirectGet pattern should be implemented with this to ensure data is not saved multiple times if a user refreshes after a post.






    share|improve this answer




























      1














      As per the dicussions, I would suggest using depending on your preference :



      1) Save to db at the end of each form post and as you suggested use the I'd to redirect to a GET.
      2) Depending on the the number of form pages and your requirements, retrieving values that a form needs on the get would be standard practice. This ensures that if a user drops off a form at any stage you can then start them off where they left off.
      3) I wouldn't setup the viewmodel for the next form in the post of the previous. Generally as part of the single responsibility principle you want to ensure that your methods have only one reason to change.
      4) PostRedirectGet pattern should be implemented with this to ensure data is not saved multiple times if a user refreshes after a post.






      share|improve this answer


























        1












        1








        1







        As per the dicussions, I would suggest using depending on your preference :



        1) Save to db at the end of each form post and as you suggested use the I'd to redirect to a GET.
        2) Depending on the the number of form pages and your requirements, retrieving values that a form needs on the get would be standard practice. This ensures that if a user drops off a form at any stage you can then start them off where they left off.
        3) I wouldn't setup the viewmodel for the next form in the post of the previous. Generally as part of the single responsibility principle you want to ensure that your methods have only one reason to change.
        4) PostRedirectGet pattern should be implemented with this to ensure data is not saved multiple times if a user refreshes after a post.






        share|improve this answer













        As per the dicussions, I would suggest using depending on your preference :



        1) Save to db at the end of each form post and as you suggested use the I'd to redirect to a GET.
        2) Depending on the the number of form pages and your requirements, retrieving values that a form needs on the get would be standard practice. This ensures that if a user drops off a form at any stage you can then start them off where they left off.
        3) I wouldn't setup the viewmodel for the next form in the post of the previous. Generally as part of the single responsibility principle you want to ensure that your methods have only one reason to change.
        4) PostRedirectGet pattern should be implemented with this to ensure data is not saved multiple times if a user refreshes after a post.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 4 at 9:50









        eVolveeVolve

        308212




        308212
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988322%2fwhat-is-the-best-way-to-handle-alternately-post-and-get-actions%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Monofisismo

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas