Эту проблему сложно объяснить, но я сделаю все возможное.
Я просто пытаюсь отобразить ввод reCaptcha в форме, встроенной в частичное представление.
Вот как я получаю частичное представление с помощью JQuery $ .get:
GetAndRenderPartialContent: function (url, obj) {
$.get(url, function (data) {
obj.replaceWith(function () {
var content = "<div id=\"" + obj.attr('id') + "\">" + data + "</div>";
return content;
});
});
}
Это прекрасно работает как метод расширения JQuery.
URL, который передается этому методу, является просто маршрутом контроллера, который возвращает частичное представление, подобное этому:
public ActionResult GetSomeContent()
{
var model = new SomeModel();
// set modal values
// Finally return partial view
return PartialView("_MyPartialView", model);
}
Это прекрасно работает. Он даже отображает значения формы, привязанные к модели.
Проблема только с reCaptcha. На мой взгляд, у меня есть эта строка для визуализации reCaptcha:
@Microsoft.Web.Helpers.ReCaptcha.GetHtml(theme: "clean", publicKey: ConfigurationManager.AppSettings["reCaptcha:publicKey"], language: "en")
Это работает, когда я внедряю его непосредственно в родительское представление. Однако, когда оно отображается с помощью метода частичного представления, я получаю следующие результаты:
<noscript>
<iframe frameborder="0" height="300px" src="http://www.google.com/recaptcha/api/noscript?k=[MY PUBLIC KEY REMOVED FOR DEMO]" width="500px"></iframe>
<br /><br />
<textarea cols="40" name="recaptcha_challenge_field" rows="3"></textarea>
<input name="recaptcha_response_field" type="hidden" value="manual_challenge" />
</noscript>
Похоже, что метод PartialView использует HtmlEncoding для вывода из reCaptcha, но не для других элементов формы, встроенных в форму. Кто-нибудь сталкивался с этим или имел элегантное решение этой надоедливой проблемы, которая занимала пару часов моего времени?
Единственное решение, которое мне удалось достичь, - отобразить reCaptcha в родительском представлении, скрыть его до вызова страницы частичного представления, а затем переместить в соответствующую позицию в форме, что нежелательно и не требуется. элегантное решение.
Любая помощь приветствуется.
Спасибо.
* ОБНОВЛЕНИЕ **
Я попытался вставить код представления здесь, но редактор stackoverflow продолжал отклонять код. Достаточно сказать, что в представлении нет ничего необычного. Модель содержит свойства для привязки, такие как:
[Required]
[Display(Name = "Email Address")]
public string Email { get; set; }
[Required]
[Display(Name = "Confirm Email Address")]
[Compare("Email", ErrorMessage = "Your email and confirmation email do not match.")]
public string ConfirmEmail { get; set; }
Форма:
@using (Html.BeginForm("UpdateInfo", "MyAccount", FormMethod.Post, new { @id = "InfoForm" }))
Визуализация элементов модели:
<div class="editor-label">
@Html.LabelFor(m => m.Email)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Email) @Html.ValidationMessageFor(m => m.Email)
</div>
В конце формы:
<fieldset id="reCaptchaFieldset">
<legend>Captcha Authorization</legend>
@ReCaptcha.GetHtml(theme: "clean", publicKey: System.Configuration.ConfigurationManager.AppSettings["reCaptcha:publicKey"])
</fieldset>