使用Recaptcha与EPiServer XForms

时间:2010-12-22 08:53:06

标签: recaptcha xforms episerver

是否有人在EPiServer中使用Recaptcha和XForms?

我不知道在哪里放置Recaptcha控件以及如何使其工作。 ASP.NET的示例代码是以下代码。我应该把它放在哪里。我猜是在FormControl_BeforeSubmitPostedData

 <%@ Page Language="VB" %>
 <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>  
 <script runat=server%gt;       
 Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs)           
    If Page.IsValid Then               
        lblResult.Text = "You Got It!"               
        lblResult.ForeColor = Drawing.Color.Green           
    Else               
        lblResult.Text = "Incorrect"               
        lblResult.ForeColor = Drawing.Color.Red           
    End If       
 End Sub   
 </script>   
 <html>   
 <body>       
 <form runat="server">           
     <asp:Label Visible=false ID="lblResult" runat="server" />
     <recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="red"
                                 PublicKey="your_public_key" PrivateKey="your_private_key" />
     <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
 </form>   
 </body>   
 </html>

2 个答案:

答案 0 :(得分:7)

我在EPiServer中修改XForms的输出方面有一些经验,但之前我没有添加任何验证码控件。我希望我可以帮助你到达那里!

我在XFormControl.BeforeLoadingForm事件上对XForms输出进行了所有修改。您可以在Global.asax.cs中为此分配一个事件处理程序,或者创建一个静态初始化程序类,该类在第一次导航到表单页面时实例化(我的模板类继承自此初始化程序类。)我只是这样做因为我需要一个很好的可部署解决方案,而无需更改Global.asax。无论如何,我离题了。

目前,我建议在Global.asax.cs中进行此操作,以便让您工作。 Global.asax.cs中有与PublicTemplates包一起安装的示例代码。寻找“全球XFrom活动”区域。

通过BeforeLoadingForm事件参数公开XForm的'markup'。

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中或在模板/ usercontrol标记的顶部注册了Recaptcha控件,那么它应该可以工作。您应该会发现验证码控件只是添加到表单的末尾(可能不是您真正希望它的位置,但只要您可以确定要在其中插入的位置,就可以按照自己的方式进行更改。 e.FormDefinition字符串。

其中“FormControl”是用户控制标记中的XForm控件。

编辑(2010年12月23日):

验证码控件必须在web.config中注册,而不是在标记文件的顶部。

<add tagPrefix="recaptcha" namespace="Recaptcha" assembly="Recaptcha" />

答案 1 :(得分:3)

如果目标是防止垃圾邮件,则更易于访问的方法是使用Akismet检查表单输入。我们已经为EPiServer中的XForms为多个客户做了这个,并且效果很好。

关于为什么CAPTCHA不利于辅助功能的文章: http://www.456bereastreet.com/archive/200709/provide_an_accessible_alternative_if_you_must_use_a_captcha/