我为其中一个页面设置了一个营销网页表单。
我为其编写了自定义提交操作,如下面的代码段所示 -
public class **CustomFormSubmit : ISaveAction**
{
public void Execute(ID formid, AdaptedResultList fields, params object[] data)
{
try
{
**//var returnValue= Custom Logic to save form data // returns true or false**
}
catch (Exception ex)
{
Logger.Log(ex.Message + ":" + builder, ExceptionCategory.Error);
throw;
}
}
在上面的网络表单中 - 成功模式是 - SuccessMode / Redirect,我为其配置了成功页面。
我在上述场景中的要求是,如果returnValue为false,则将用户保持在同一页面(使用Form)。 (如上面的代码片段所示)
任何人都可以在上面的场景中指导我 - 如何让用户在同一页面上填写表格中填写的值,以便用户可以再次提交。 产品详细信息 - 7.2 rev。 141226,营销人员Web表格2.4 rev.140117
添加更多详情 我不知道如果在上面的代码片段中返回为false,我怎么能回到我的页面而不是重定向。 单击提交按钮后,上面的函数 - 执行 - 被调用。 如何返回页面 - 我是否需要覆盖任何功能或自定义内容。
如果在保存数据时任何异常,则控件将返回到同一页面,并保留用户填写的所有值 - 使用在Sitecore中配置的保存操作失败消息< / strong>。 所以我的要求要转到表格,如果出现异常,当false为保存数据时返回值并放置可能每次都更改的自定义错误消息,因此不是静态配置,相当有活力的。 谢谢! SAURABH
答案 0 :(得分:2)
一个选项是重定向到包含表格的原始页面。
使用ReadQueryString
属性,通过表单呈现器的演示详细信息,使表单通过查询字符串填充字段:
因此,在您false
的{{1}}上,您创建了一个查询字符串集合,其中包含每个字段的名称,如表单中所示,后跟用户的值。
下面的代码将循环遍历所有字段,并将其排列为具有FieldName和Value的QueryString;
Save Action
然后,Sitecore会自动使用这些值填充相应的字段,从而达到您的要求。
修改强>
我发现抛出的大多数异常会将用户带回填充其值的表单。然后,您可以传递无法写入CRM的原因。见下面的例子
string urlOfForm = HttpContext.Current.Request.Url.AbsolutePath;
var queryString = new StringBuilder("?");
foreach (AdaptedControlResult field in fields)
{
queryString.Append(string.Format("{0}={1}&", field.FieldName, field.Value));
}
urlOfForm = urlOfForm + queryString;
HttpContext.Current.Response.Redirect(urlOfForm);
然后,复杂性会动态地交换 if (submitFailed)
{
throw new Exception("The email address entered already exists in our System");
}
以显示此Save Action Failed Message
。我发现的有关自定义保存操作消息状态的所有帖子唯一真正的方法是通过自定义Exception Message
重定向到显示不同消息的其他页面。哪个不适合您的要求。
我找到了你需要修补Save Action
和FormSubmitFailedArgs
的管道Args。前者将需要以下更改
SubmitFailedArgs
并且后者需要
public FormSubmitFailedArgs(ID formID, AdaptedResultList fields, ID actionFailed, Exception ex)
: base(formID, actionFailed, ex)
{
this.Fields = fields;
this.ErrorMessage = ex.Message;
}
提交消息的位置和样式:
您需要找到FormRender子布局文件,默认为public SubmitFailedArgs(ID formID, ID actionFailed, string errorMessage, Exception innerException)
{
this.FormID = formID;
this.ActionFailed = actionFailed;
this.ErrorMessage = innerException.Message;
this.InnerException = innerException;
}
,在那里您会找到一个名为website\sitecore modules\Web\Web Forms for Marketers\Control\SitecoreSimpleFormAscx.ascx
的compont,它会将提交消息移到您需要的位置。
另请注意,它引用了SubmitSummary
CssClass
这是您需要更改Message的样式所需的目标。这个答案已经非常长,所以我不打算如何更改该课程的样式,例如参见 - http://www.awareweb.com/awareblog/10-1-13-wffmguide
管道修补
我已深入挖掘,为了使用我们创建的自定义Args来使用异常错误消息,您需要控制最终使用这些Args的Pipeline,这是scfSubmitSummary
中的处理器{ {1}}管道。
根据我的调查,它不需要花费太多精力就可以修补它,您可以直接修改Sitecore.Form.Core.Pipelines.FormSubmit.FormatMessage, Sitecore.Forms.Core
或使用<errorSubmit>
中的配置文件中的Sitecore.Forms.config
进行修改文件夹 - 请参阅此处more info。
答案 1 :(得分:2)
一种选择是创建自定义表单验证操作。你可以在这里保存数据,虽然最好在这里根据你的API验证数据,然后将数据保存在自定义保存操作中,因为这似乎更符合WFFM的意义。功能
using Sitecore.Data;
using Sitecore.Form.Core.Controls.Data;
using Sitecore.Form.Core.Submit;
using System;
using System.Collections.Generic;
namespace Custom.WFFM
{
public class CustomVerificationStep : BaseCheckAction
{
public string FailedMessage { get; set; }
public override void Execute(ID formid, IEnumerable<ControlResult> fields)
{
// Call your API
// You have access to the fields, so you can pass them through as parameters to your if needed
bool flag = ServiceAPI.ValidateUserData(param1, param2, etc);
if (!flag)
{
throw new Exception(string.Format(this.FailedMessage ?? "There was an error while verifying the data against the service call"));
}
}
public override ActionState QueryState(ActionContext context)
{
return ActionState.DisabledSingleCall;
}
}
}
在/sitecore/system/Modules/Web Forms for Marketers/Settings/Actions/Form Verification
:
您可以在Parameters
字段中将其设置为<FailedMessage>Custom Failed Error Message</FailedMessage>
来更改错误消息。
然后将验证步骤添加到表单中:
如果每个表单需要不同的错误消息,则可以设置错误消息以显示在“错误消息”选项卡中。
然后,用户将返回到同一个用户,而不会调用任何保存操作,表单字段仍然填写。