Я думаю, вы правы, и причина, по которой ваш код не работает, заключается в том, что вы используете 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
. Мне не нравится решение, но оно сработало для меня:
Измените поле Controller
элемента /sitecore/layout/Renderings/Modules/Web Forms for Marketers/Mvc Form
:
![введите здесь описание изображения](https://i.stack.imgur.com/1FoEB.png)
Реализуйте свой собственный контроллер — если 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