Перезаписать успешное перенаправление для WFFM в проекте MVC

Я пытаюсь перезаписать класс SuccesRedirect из модуля WFFM. Я нашел несколько блогов/веб-сайтов, рассказывающих, как это сделать (например, https://adesev.wordpress.com/2014/08/07/wffm-success-redirect/ )

Но это не работает для меня. Я создаю веб-сайт MVC, может быть, проблема в этом? Так как есть файл Sitecore.forms.config и файл Sitecore.forms.MVC.config. Но я не могу найти никакой документации по этому поводу.

Кто-нибудь знает, как этого добиться или где я могу найти дополнительную информацию об этом?

Редактировать:

Я использую WFFM Version 8.0 rev. 141217.

Что я сделал, так это я следил за блогом, который я перечислил выше:

Измененный файл Sitecore.forms.config: изменен узел succesAction следующим образом:

  <successAction>
    <processor type="be.absi.kbs.extensions.SuccesRedirectWFFM, be.absi.kbs.extensions" />
    <processor type="Sitecore.Form.Core.Pipelines.FormSubmit.FormatSuccessMessage, Sitecore.Forms.Core" />
  </successAction>

И я создал класс следующим образом: (имя сборки "be.absi.kbs.extensions")

namespace be.absi.kbs.extensions
{
    class SuccesRedirectWFFM : ClientPipelineArgs
    {
        public void Process(SubmitSuccessArgs args)
        {

И я пытаюсь сделать следующее:

Если URL-адрес имеет параметр returnUrl, необходимо перенаправить на этот URL-адрес. например myWebsite/Login?returnUrl=/Blogs Необходимо перенаправить пользователя в раздел блога после успешного входа в систему.

Но пока я не могу добраться до метода Process.


person Timon    schedule 03.10.2015    source источник
comment
Можете ли вы объяснить, что вы хотите изменить в поведении SuccessRedirect по умолчанию, что вы сделали для этого и что вам не подходит?   -  person Marek Musielak    schedule 03.10.2015
comment
Также какую версию Sitecore и WFFM вы используете?   -  person Marek Musielak    schedule 03.10.2015
comment
См. правку выше @MarekMusielak   -  person Timon    schedule 03.10.2015


Ответы (1)


Я думаю, вы правы, и причина, по которой ваш код не работает, заключается в том, что вы используете MVC.

Прежде всего, не заменяйте исходное действие SuccessRedirect своим действием SuccesRedirectWFFM — добавьте свое действие перед исходным:

<successAction>
  <processor type="be.absi.kbs.extensions.SuccesRedirectWFFM, be.absi.kbs.extensions" />
  <processor type="Sitecore.Form.Core.Pipelines.FormSubmit.SuccessRedirect, Sitecore.Forms.Core" />
  <processor type="Sitecore.Form.Core.Pipelines.FormSubmit.FormatSuccessMessage, Sitecore.Forms.Core" />
</successAction>

Затем в своем коде проверьте значение параметра returnUrl как в текущем URL-адресе запроса, так и в URL-адресе:

public class SuccesRedirectWFFM : ClientPipelineArgs
{
    public void Process(SubmitSuccessArgs args)
    {
        Assert.IsNotNull(args, "args");

        string returnUrl = HttpContext.Current.Request["returnUrl"]

        if (string.IsNullOrEmpty(returnUrl)) 
        {
            returnUrl = HttpUtility.ParseQueryString(HttpContext.Current.Request.UrlReferrer.Query)["returnUrl"];
        }

        if (!string.IsNullOrEmpty(returnUrl))
        {
            args.AbortPipeline();
            WebUtil.Redirect(returnUrl, false);
        }
    }
}

Причина этого в MVC, когда вы отправляете форму, запрос на сервер, скорее всего, является вызовом ajax и не содержит исходный URL-адрес.

Пожалуйста, помните, что это не окончательная версия кода — она просто должна указать вам правильное направление, например. следует добавить дополнительные проверки для типа действия Success.


EDIT: Вы правы. Я проверил код, и похоже, что в Sitecore MVC все действия выполняются в классе FormController. Мне не нравится решение, но оно сработало для меня:

  1. Измените поле Controller элемента /sitecore/layout/Renderings/Modules/Web Forms for Marketers/Mvc Form:

    введите здесь описание изображения

  2. Реализуйте свой собственный контроллер — если returnurl не определено, используйте реализацию по умолчанию:

namespace My.Assembly.Namespace
{
    public class FormController: SitecoreController, IHasModelFactory, IHasFormDataManager
    {
        public IModelFactory ModelFactory
        {
            get;
            private set;
        }

        public IFormDataManager FormManager
        {
            get;
            private set;
        }

        public FormController() : this((IModelFactory)Sitecore.Configuration.Factory.CreateObject("wffm/modelFactory", true), (IFormDataManager)Sitecore.Configuration.Factory.CreateObject("wffm/formDataManager", true))
        {
        }

        public FormController(IModelFactory modelFactory, IFormDataManager formDataManager)
        {
            Assert.ArgumentNotNull(modelFactory, "modelFactory");
            Assert.ArgumentNotNull(formDataManager, "formDataManager");
            this.ModelFactory = modelFactory;
            this.FormManager = formDataManager;
        }

        [HttpGet]
        public override ActionResult Index()
        {
            return InnerController.Index();
        }

        [SubmittedFormHandler, ValidateHttpAntiForgeryToken, HttpPost]
        public virtual ActionResult Index([ModelBinder(typeof(FormModelBinder))] FormModel form)
        {
            Assert.ArgumentNotNull(form, "form");
            if (this.FormManager == null)
            {
                return null;
            }
            string returnUrl = System.Web.HttpContext.Current.Request["returnUrl"];

            if (string.IsNullOrEmpty(returnUrl))
            {
                returnUrl = HttpUtility.ParseQueryString(System.Web.HttpContext.Current.Request.UrlReferrer.Query)["returnUrl"];
            }

            if (!string.IsNullOrEmpty(returnUrl))
            {
                return base.RedirectToRoute(MvcSettings.SitecoreRouteName, new
                {
                    pathInfo = returnUrl.TrimStart(new char[]
                    {
                        '/'
                    })
                });
            }

            return InnerController.Index(form);
        }

        private Sitecore.Forms.Mvc.Controllers.FormController InnerController
        {
            get
            {
                Sitecore.Forms.Mvc.Controllers.FormController formController =
                    (Sitecore.Forms.Mvc.Controllers.FormController)System.Web.Mvc.ControllerBuilder.Current.GetControllerFactory().CreateController(this.ControllerContext.RequestContext, "Sitecore.Forms.Mvc.Controllers.FormController, Sitecore.Forms.Mvc");
                formController.ControllerContext = this.ControllerContext;
                return formController;
            }
        }
    }
}
person Marek Musielak    schedule 03.10.2015
comment
Я заменил узел succesAction на тот, который вы мне дали, но результат тот же. Код/класс никогда не достигается. - person Timon; 04.10.2015
comment
Ты прав. См. обновленный ответ (часть после EDIT:). - person Marek Musielak; 04.10.2015