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