使用Recaptcha与EPiServer XForms

And*_*ndy 2 xforms episerver recaptcha

有没有人在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>
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 7

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

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

现在,我建议你在Global.asax.cs中做这件事只是为了让你工作.Global.asax.cs中有与PublicTemplates包一起安装的示例代码.寻找"全球XFrom事件"区域.

通过BeforeLoadingForm事件参数公开XForm的'标记'.

e.FormDefinition
Run Code Online (Sandbox Code Playgroud)

无论用户在XForm编辑器中创建了什么,修改此字符串都将更改表单的呈现输出.例如:

e.FormDefinition += "<asp:HyperLink runat=\"server\" Text=\"HyperLink\" />";
Run Code Online (Sandbox Code Playgroud)

此示例显然会将标记添加到当前存在的内容中,但如果您愿意,可以完全转换原始标记.(我使用正则表达式将表转换为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\" />";
}
Run Code Online (Sandbox Code Playgroud)

编辑:

抱歉,上面的代码将帮助您将验证码控件集成到表单中,但在提交表单之前完全错过了实际检查验证码控件输入是否有效的部分!

我同意您将在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.)
     */
}
Run Code Online (Sandbox Code Playgroud)

至于上面的例子,只要你在web.config或模板/ usercontrol标记的顶部注册了Recaptcha控件,那么它应该可以工作.你会发现,验证码控制刚才添加到窗体结束(可能不是你真的希望它是,但可以以自己的方式,只要改变你可以找出要内插入e.FormDefinition字符串.

其中"FormControl"是用户控件标记中的XForm控件.

编辑(23/12/2010):

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

<add tagPrefix="recaptcha" namespace="Recaptcha" assembly="Recaptcha" />
Run Code Online (Sandbox Code Playgroud)