ОК ...
Я скачал и реализовал эту Реализацию Recaptcha для MVC, которая использует ModelState для подтверждения достоверности элемента управления капчи.
Это прекрасно работает ... за исключением случаев, когда я начинаю использовать его в форме AJAX.
В двух словах, когда div перерисовывается с помощью AJAX, 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
Я подтвердил, что Форма отлично функционирует, когда отсутствует элемент управления Recaptcha и все вызовы Javascript в AjaxOptions
работают нормально.
Проблема заключается в том, что если ModelState
является недействительным в результате повторной проверки или какой-либо другой проверки, то 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 не выполняет повторную визуализацию. Я проверил источник и блоки <script>
& <noscript>
присутствуют в HTML, так что вспомогательная функция HTML ниже, очевидно, работает
<%= Html.CreateRecaptcha("recaptcha", "blackglass") %>
Я предполагаю, что это как-то связано с тем, что сценарии, введенные в DOM AJAX, не выполняются повторно.
Как вы можете видеть из приведенного выше фрагмента HTML
, я пытался добавить функцию javascript OnComplete=
для повторного создания капчи на стороне клиента, но хотя скрипт выполняется без ошибок, он не ' т работа. Функция OnComplete is.
function ReloadRecaptcha() {
Recaptcha.create("my-pub-key", 'blahCaptcha', {
//blahCaptcha is the ID of the <td> where the ReCaptcha should go.
theme: 'blackglass'
});
}
Может кто-нибудь пролить свет на это?
Спасибо,
Эоин С