代码之家  ›  专栏  ›  技术社区  ›  Eoin Campbell

在一篇AJAX文章之后,如何在ASP.NET MVC 2中正确地重新呈现Recaptcha

  •  3
  • Eoin Campbell  · 技术社区  · 16 年前

    我已经下载并实现了这个 Recaptcha implementation 对于MVC,它使用ModelState来确认captcha控件的有效性。

    它的工作非常出色。。。除非我开始在AJAX表单中使用它。

    简而言之,当使用AJAX重新呈现div时,它应该包含的ReCaptcha不会出现,即使相关的 <scripts> 在部分渲染后的源中。

    代码如下。

     using (Ajax.BeginForm("CreateComment", "Blog", 
            new AjaxOptions() { HttpMethod = "POST", 
             UpdateTargetId = "CommentAdd", OnComplete="ReloadRecaptcha", 
             OnSuccess = "ShowComment", OnFailure = "ShowComment", 
             OnBegin = "HideComment" }))
    {%>
        <fieldset class="comment">
            <legend>Add New Comment</legend>
            <%= Html.ValidationSummary()%>
            <table class="postdetails">
                <tbody>
                    <tr>
                        <td rowspan="3" id="blahCaptcha">
                            <%= Html.CreateRecaptcha("recaptcha", "blackglass") %>
                        </td>
                        .... Remainder of Form Omitted for Brevity
    

    AjaxOptions

    问题是如果 ModelState 由于Recaptcha或其他验证而无效,则 ActionResult

        [RecaptchaFilter(IgnoreOnMobile = true)]
        [HttpPost]
        public ActionResult CreateComment(Comment c)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    //Code to insert Comment To DB
                    return Content("Thank You");
                }
                catch
                {
                    ModelState.AddRuleViolations(c.GetRuleViolations());
                }
            }
            else
            {
                ModelState.AddRuleViolations(c.GetRuleViolations());
            }
            return View("CreateComment", c);
       }
    

    当它无效并且表单发回时,由于某种原因ReCaptcha控件不会重新呈现。我查过消息来源和 <script> & <noscript>

    <%= Html.CreateRecaptcha("recaptcha", "blackglass") %>
    

    正如你从照片上看到的 HTML 上面的片段,我试图添加一个 OnComplete= javascript函数在客户端重新创建验证码,但是尽管脚本执行时没有错误,但它不起作用。OnComplete函数为。

        function ReloadRecaptcha() {
            Recaptcha.create("my-pub-key", 'blahCaptcha', { 
                //blahCaptcha is the ID of the <td> where the ReCaptcha should go.
                theme: 'blackglass'
                });
        }
    

    谢谢,

    3 回复  |  直到 16 年前
        1
  •  2
  •   Eoin Campbell    16 年前

    找到了解决办法。

    我用HTML助手完全删除了Captcha的客户端呈现。

    相反,过滤器留在服务器端,用于进行ModelState验证等。。。

    http://recaptcha.net/fastcgi/demo/ajax http://api.recaptcha.net/js/recaptcha_ajax.js

    每次出现部分post时,captcha就会消失,每次完成时,OnComplete脚本就会重新创建它。

        2
  •  0
  •   Dave Swersky    16 年前

    <div> 或者脚本用验证码图像更新的东西。create()函数不应该传递'Recaptcha'(元素的id)而不是'blahCaptcha'(td的名称)吗?

    看看HTML.CreateRecaptcha生成的HTML,并尝试引用由该扩展创建的元素的id,而不是包含td的元素的id。