3

Ok...

ModelState を使用してキャプチャ コントロールの有効性を確認する MVC 用のこのRecaptcha 実装をダウンロードして実装しました。

それは見事に機能します... AJAXフォームで使い始めたときを除いて。

<scripts>簡単に言えば、div が AJAX で再レンダリングされると、部分レンダリング後にソースに関連するものが含まれていても、そこに含まれているはずの ReCaptcha が表示されません。

以下のコード。

 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

Recaptcha コントロールが存在せず、Javascript 呼び出し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);
   }

InValid で、フォームがポスト バックされると、何らかの理由で ReCaptcha コントロールが再レンダリングされません。ソースを確認したところ、HTML に<script>&<noscript>ブロックが存在するため、以下の HTML ヘルパー関数は明らかに機能しています。

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

これは、AJAX によって DOM に挿入されたスクリプトが再実行されないことに関係していると思います。

上記のスニペットからわかるように、クライアント側で Captcha を再作成するために JavaScript 関数HTMLを追加しようとしましOnComplete=たが、スクリプトはエラーなしで実行されますが、機能しません。OnComplete 関数です。

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

誰でもこれに光を当てることができますか?

ありがとう、Eoin C

4

3 に答える 3

2

これに対する解決策を考え出しました。

HTMLヘルパーを使用して、キャプチャのクライアント側のレンダリングを完全に削除しました。

代わりに、ModelState検証などを実行するために、フィルターはサーバー側に配置されたままになります。

また、クライアント側のレンダリングはすべて、 http: //recaptcha.net/fastcgi/demo/ajax および http://api.recaptcha.net/js/recaptcha_ajax.jsのReCaptchaAJAXApiを使用して行われます 。

部分的な投稿が発生するたびに、キャプチャが消え、完了するたびに、OnCompleteスクリプトがキャプチャを再作成します。

于 2010-03-27T11:21:15.553 に答える
0

Html.CreateRecaptcha() 拡張機能は<div>、スクリプトがキャプチャ画像で更新するものを作成すると思います。Recaptcha.create() 関数は、'blahCaptcha' (td の名前) の代わりに 'recaptcha' (要素の ID) を渡すべきではありませんか?

Html.CreateRecaptcha によって生成された HTML を見て、含まれている td の ID ではなく、その拡張によって作成された要素の ID を参照してみてください。

于 2010-03-26T16:38:12.727 に答える
0

この AJAX 実装は非常に便利であることがわかりました。http://www.darksideofthecarton.com/2008/12/15/validating-recaptcha-jquery-ajax/

この記事に基づいて、MVC コードに同じソリューションを適用しました。

http://devlicio.us/blogs/derik_whittaker/archive/2008/12/02/using-recaptcha-with-asp-net-mvc.aspx

于 2011-09-29T06:36:21.483 に答える