Я собрал небольшой пример, чтобы повторить проблему.У меня строго типизированное частичное представление _Name.cshtml:
@model ValidationInPartial.ViewModels.MyViewModel
<h2>@ViewBag.Message</h2>
<fieldset>
<legend>Name</legend>
<div class="editor-label">
@Html.LabelFor(model => model.MyName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MyName)
@Html.ValidationMessageFor(model => model.MyName)
</div>
<a href="#" id="reload">Reload Name</a>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<script type="text/javascript">
$(document).ready(function () {
$("#reload").click(function () {
$("#divName").load("Home/NameReload");
});
});
</script>
, которое изначально загружается и отображается внутри основного Index.cshtml
<div id="divForm">
@using (Html.BeginForm()) {
<div id="divName">
@Html.Partial("_Name")
</div>
}
</div>
Поле MyName необходимо и проверка выполняетсячерез обязательный атрибут в MyViewModel
namespace ValidationInPartial.ViewModels
{
public class MyViewModel
{
[Required(ErrorMessage = "Please enter a Name.")]
public string MyName { get; set; }
}
}
После первой загрузки страницы, если вы нажмете кнопку «Создать», оставив поле пустым, появится сообщение проверки «Пожалуйста, введите имя».показывает рядом с полем, и само поле становится розовым, что является ожидаемым поведением.Теперь, нажав на ссылку «Обновить имя», которая выполняет ajax-вызов (jquery.load (...)), парциальная часть перезагружается, вот код контроллера:
public PartialViewResult NameReload()
{
MyViewModel myViewModel = new MyViewModel();
ViewBag.Message = "Name Reloaded";
return PartialView("_Name", myViewModel);
}
На этот раз, если вы нажметекнопка «Создать», оставляющая поле пустым, рядом с полем не появляется сообщение проверки, хотя поле становится розовым.Оказывается, при перезагрузке партиала @ Html.ValidationMessageFor не отображает сообщение проверки в первый раз.
Вот файлы jquery, которые я использую
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
Интересно,это ошибка в том, как движок Razor отображает @ Html.ValidationMessageFor или это проблема с jquery?Любая идея, почему это происходит?
Я также где-то читал, что вызов ajax теряет все скрипты для страницы, на самом деле я должен держать любой код JavaScript внутри партиала, чтобы они могли быть воспроизведены и использованы снова.
Тем временем я нашел обходной путь, который заключается в том, чтобы вручную визуализировать в части, то, что должно было быть отрисовано с помощью @ Html.ValidationMessageFor, а именно:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="MyName"></span>
Однако этот обходной путь означает, чтоесли мы изменим тип проверки или просто сообщение проверки в атрибуте Required в ViewModel, нам нужно изменить этот жестко запрограммированный фрагмент HTML в представлении.