Skip to main content

Umbraco Forms Custom Workflows Tip: How to redirect to another page other than the default thank you page after submitting an Umbraco Forms form

Umbraco Forms is an add-on for Umbraco CMS that allows you to easily create forms and link them to your content pages. After the form submissions, you can redirect your web users to a "thank you" page using the built-in "Submit message / Go to page" workflow. However, what if you want to redirect to a page dynamically based on the data submitted by the end user?

Custom workflow to redirect 

One of the best solutions is to create a custom Umbraco Forms workflow based on requirements. 

For Umbraco v13+ websites, rather than using the HttpContext to redirect, which won't work out of the box for your custom workflow, you should use the WorkflowExecutionContext to set the GoToPageOnSubmit property of your form, like this.

context.Form.GoToPageOnSubmit = goToPage.Id;

It is as simple as this. You can now do your tests and dynamically redirect your users to the next page after the form submissions.

Full code

using ProjectName.Website.Core.FormExtensions.Constants;
using ProjectName.Website.Core.FormExtensions.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Umbraco.Cms.Core.Web;
using Umbraco.Forms.Core;
using Umbraco.Forms.Core.Attributes;
using Umbraco.Forms.Core.Enums;

namespace ProjectName.Website.Core.FormExtensions.CustomWorkflows
{
    public class ConditionalGoToPageWorkflow : WorkflowType
    {
        private readonly IUmbracoContextAccessor _umbracoContextAccessor;
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly ILogger<ConditionalGoToPageWorkflow> _logger;

        public ConditionalGoToPageWorkflow(IUmbracoContextAccessor umbracoContextAccessor,
        IHttpContextAccessor httpContextAccessor,
        ILogger<ConditionalGoToPageWorkflow> logger)
        {
            Name = "Go to page based on conditions";
            Id = new Guid(FormWorkflowIds.ConditionalGoToPageWorkflowId);
            Description = "This will go to a page based on a condition in the form";
            Icon = "icon-directions-alt";
            _umbracoContextAccessor = umbracoContextAccessor;
            _httpContextAccessor = httpContextAccessor;
            _logger = logger;
        }

        [Setting("Routes",
        Description = "Page to go to on submission, depending on selected fields",
        View = "FieldConditions")]
        public string Routes { get; set; } = string.Empty;

        public override Task<WorkflowExecutionStatus> ExecuteAsync(WorkflowExecutionContext context)
        {
            try
            {
                List<PageRouteMapping> pageRoutes = JsonConvert.DeserializeObject<List<PageRouteMapping>>(Routes);
                foreach (var route in pageRoutes)
                {
                    Guid.TryParse(route.Field, out var fieldGuid);
                    if (fieldGuid != Guid.Empty &&
                    context.Record.RecordFields.ContainsKey(fieldGuid) &&
                    context.Record.RecordFields[fieldGuid].HasValue())
                    {
                        var fieldValue = context.Record.RecordFields[fieldGuid].ValuesAsString();
                        if (!string.IsNullOrWhiteSpace(fieldValue) &&
                        fieldValue.Equals(route.FieldValue))
                        {
                            if (_umbracoContextAccessor.TryGetUmbracoContext(out var umbracoContext) &&
                                _httpContextAccessor.HttpContext != null &&
                                !string.IsNullOrEmpty(route?.PageUdi) &&
                                route.PageUdi.StartsWith("umb://document/"))
                            {
                                // Extract the GUID from the UDI string
                                var guidString = route.PageUdi.Replace("umb://document/", "");
                                if (Guid.TryParse(guidString, out var guid))
                                {
                                    var goToPage = umbracoContext.Content?.GetById(guid);
                                    if (goToPage != null)
                                    {
                              // This won't work!
//_httpContextAccessor.HttpContext
//.Response.Redirect(goToPage.Url());

                              // This will redirect the user to the next page
                          context.Form.GoToPageOnSubmit = goToPage.Id;
                                       
                                        return Task.FromResult(WorkflowExecutionStatus.Completed);
                                    }
                                }
                            }
                        }
                    }
                }
                return Task.FromResult(WorkflowExecutionStatus.Completed);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex,
                $"There was a problem going to page from Workflow for
                Form {context.Form.Name} with
                id {context.Form.Id} for
                Record with unique id {context.Record.UniqueId}");
                return Task.FromResult(WorkflowExecutionStatus.Failed);
            }
        }

        public override List<Exception> ValidateSettings()
        {
            List<Exception> exceptionList = new List<Exception>();
            // Removed for brevity
            return exceptionList;
        }
    }
}







Comments

Popular posts from this blog

How to fix Git push error: "RPC failed; curl 56 HTTP/2 stream 7 was reset send-pack: unexpected disconnect while reading sideband packet fatal: the remote end hung up unexpectedly"

Problem Today I saw the following problem when I tried to push my changes to a Git server after doing some work for upgrading an Umbraco v7 project to v8.18.8.  Possible reasons After some investigations, it seems like this could be because of the following reasons; Git is not happy with the amount of changes that are being pushed into the server.  There are possible limitations on the server about the size/amount of files that you can push. Your internet connection is not good and stable enough. Your Git client's version is old. Solution options For me, the easiest option was connecting to another Wifi and trying again. Apparently, this option helped quite a few people, so it is worth giving it a try. Unfortunately, it didn't work for me. A bad internet connection wasn't an option for me either, as my internet is pretty fast (500 Mbps). Similarly, my Git client version was the latest version (git version 2.41.0.windows.3).  On StackOverflow, there were a lot of recommend...

How to fix "Microsoft SQL Error SQL71564: Error validating element [USERNAME]: The element [USERNAME] has been orphaned from its login and cannot be deployed."

I needed to export a database in BACPAC format today in order to restore it somewhere else, and I encountered the following error. To resolve this issue, I deleted all of the users mentioned in the error log. After successfully creating the BACPAC file, I used it to create a new database with no problems. Error: TITLE: Microsoft SQL Server Management Studio ------------------------------ One or more unsupported elements were found in the schema used as part of a data package. Error SQL71564: Error validating element [USER1]: The element [USER1] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER2]: The element [USER2] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER3]: The element [USER3] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER4]: The element [USER4] has been orphaned from its login and cannot be deployed. Error SQL71...

How to use JQuery Ajax Methods for Async ASP.NET MVC Action Methods

Making repeatedly calls to async methods can be a nightmare. In this case, it makes sense to use 2 ajax methods, instead of one. Here is a simple solution to overcome this problem. See that  ajaxcalls   is emptied after the success response for the first ajax call and then the second ajax method is used to make one single call to the async action method. Hope it helps. View: @section Scripts{     < script type ="text/javascript">         var smartDebitObject = new Object();         smartDebitObject.MembershipNumber = $( "#MembershipNumber" ).val();         smartDebitObject.ProfileId = $( "#ProfileId" ).val();         smartDebitObject.FirstName = $( "#FirstName" ).val();         smartDebitObject.LastName = $( "#LastName" ).val();     ...