Search code examples
asp.net-coreasp.net-core-mvc

ASP.NET Core MVC : return view and then redirect to another one


I'm new to ASP.NET Core MVC. I have code like this in my controller:

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ConfirmEmail(string userId, string code)
{
    var result = await _userManager.ConfirmEmailAsync(user, code);
    return View(result.Succeeded ? "ConfirmEmail" : "Error");
}

The ConfirmEmail view will be returned and rendered. But after showing this ConfirmEmail view, I want to redirect to another route automatically and show another view.

How can I do that? Could you guide me, please?

Probably, it should have be done from my ConfirmEmail.cshtml view. So is there any way to call some redirect C# function after ConfirmEmail.cshtml rendering? Or something like that?


Solution

  • Probably, it should have be done from my ConfirmEmail.cshtml view.

    Indeed it should. This is because an HTTP response can only have one response. A page (view) is a response, and a redirect ("location header") is a response. The controller can only return one or the other, not both.

    So is there any way to call some redirect C# function after ConfirmEmail.cshtml rendering?

    C# runs server-side. By the time the view is rendered in the browser, the server-side code has already executed on the server and is done.

    After returning a view, you can redirect in client-side code. For example, if the view contains this:

    <script type="text/javascript">
      window.location.replace("@Url.Action("actionName", "controllerName")");
    </script>
    

    Then the resulting client-side code would be something like:

    <script type="text/javascript">
      window.location.replace("/controller/action");
    </script>
    

    This would immediately redirect the user to that URL. If you don't want it to be immediate then you could put it inside of a timeout:

    <script type="text/javascript">
      setTimeout(function () {
        window.location.replace("@Url.Action("actionName", "controllerName")");
      }, 5000);
    </script>
    

    The value 5000 indicates that the operation should be performed after 5000 ms (5 seconds).