我有一些在 EPiServer 中修改 XForms 输出的经验,但我之前没有添加任何验证码控件。我希望我能帮助你到达那里!
我在 XFormControl.BeforeLoadingForm 事件上对 XForms 输出进行所有修改。您可以在 Global.asax.cs 中为此分配一个事件处理程序,也可以创建一个静态初始化程序类来实例化某人第一次导航到表单页面(我的模板类继承自这个初始化程序类。)我这样做只是因为我需要一个很好的可部署解决方案,而无需更改 Global.asax。无论如何,我离题了。
目前,我建议在 Global.asax.cs 中进行,只是为了让您工作。Global.asax.cs 中有与 PublicTemplates 包一起安装的示例代码。寻找“全球 XFrom 事件”区域。
XForm 的“标记”通过 BeforeLoadingForm 事件参数公开。
e.FormDefinition
无论用户在 XForm 编辑器中创建了什么,修改此字符串都会更改表单的呈现输出。例如:
e.FormDefinition += "<asp:HyperLink runat=\"server\" Text=\"HyperLink\" />";
此示例显然将标记添加到当前存在的内容中,但如果您愿意,您可以完全转换原始标记。(我使用正则表达式将表格转换为 div/fieldset 标签)
我希望这可以帮助您找到解决方案。
Global.asax.cs 的示例代码
protected void Application_Start(Object sender, EventArgs e)
{
XFormControl.ControlSetup += new EventHandler(XForm_ControlSetup);
}
public void XForm_ControlSetup(object sender, EventArgs e)
{
XFormControl control = (XFormControl)sender;
control.BeforeLoadingForm += new LoadFormEventHandler(XForm_BeforeLoadingForm);
}
public void XForm_BeforeLoadingForm(object sender, LoadFormEventArgs e)
{
XFormControl formControl = (XFormControl)sender;
//We set the validation group of the form to match our global validation group in the master page.
formControl.ValidationGroup = "XForm";
e.FormDefinition += "<asp:HyperLink runat=\"server\" NavigationUrl=\"#\" Text=\"HyperLink\" />";
}
编辑:
抱歉,上面的代码将帮助您将验证码控件集成到您的表单中,但是完全错过了在提交表单之前实际检查验证码控件输入是否有效的部分!
我同意您将对 XFormControl.BeforeSubmitPostedData 中的控件进行检查。然后,如果验证码无效,则输出错误消息并将 e.CancelSubmit 设置为 true。
回应评论:
我可能过于简化了事情,但这是我认为您需要的一个简单示例。在您的 XForm 用户控件代码中,您需要类似于以下内容:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.FormControl.BeforeLoadingForm += new LoadFormEventHandler(FormControl_BeforeLoadingForm);
this.FormControl.BeforeSubmitPostedData += new SaveFormDataEventHandler(FormControl_BeforeSubmitPostedData);
}
void FormControl_BeforeLoadingForm(object sender, LoadFormEventArgs e)
{
e.FormDefinition += "<recaptcha:RecaptchaControl runat=\"server\" id=\"CaptchaControl\" />";
}
void FormControl_BeforeSubmitPostedData(object sender, SaveFormDataEventArgs e)
{
/* find the captcha control e.g. FormControl.FindControl("CaptchaControl") or otherwise
* test if the control is valid
* if not valid e.CancelSubmit = true (show error etc.)
*/
}
对于上面的示例,只要您在 web.config 或模板/用户控件标记的顶部注册了 Recaptcha 控件,它就可以工作。您应该会发现验证码控件只是添加到表单的末尾(可能不是您真正想要的位置,但是只要您可以确定要将其插入到e.FormDefinition 字符串。
其中“FormControl”是用户控件标记中的 XForm 控件。
编辑(2010 年 12 月 23 日):
验证码控件必须在 web.config 中注册,而不是在标记文件的顶部。
<add tagPrefix="recaptcha" namespace="Recaptcha" assembly="Recaptcha" />