Вложенные макеты Razor, вызывающие сбой проверки клиента - PullRequest
1 голос
/ 06 мая 2011

Вот моя оригинальная страница создания (без вложенности) - проверка клиента работает

@model TennisClub.ViewModels.ClubMember.EditorModel
@{
    ViewBag.Title = "New Club Member";
    ViewBag.LegendTitle = "Club Member";
}
<h2>@ViewBag.Title</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Errors were found on the form. Please correct all errors and try again.")
    <fieldset>
        <legend>@ViewBag.LegendTitle</legend>
        @Html.EditorForModel()
        <p><input type="submit" value="Create" /></p>
    </fieldset>
}
<div>@Html.ActionLink("Back to List", "Index")</div>

Вот моя новая страница Создать (вложенная) - СБОЙ проверки клиента

@model TennisClub.ViewModels.ClubMember.EditorModel
@{
    Layout = "~/Views/Shared/StandardLayouts/Create.cshtml";
    ViewBag.Title = "New Club Member";
    ViewBag.LegendTitle = "Club Member";
}
@Html.EditorForModel()
@if (ViewBag.CanUserAccessRestrictedContent)

Вот макет (StandardLayouts / Create.cshtml), используемый на вышеуказанной странице

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@ViewBag.Title</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Errors were found on the form. Please correct all errors and try again.")
    <fieldset>
        <legend>@ViewBag.LegendTitle</legend>
        @RenderBody()
        <p><input type="submit" value="Create" /></p>
    </fieldset>
}
<div>@Html.ActionLink("Back to List", "Index")</div>

Обсуждение

Насколько я могу судить, все работает нормально, используя вложенный подход, за исключением проверки клиента. Когда я смотрю на исходный код страницы, там есть ссылки на сценарии (validate и validate.unobtrusive), но в html атрибуты проверки не отображаются. Если я не использую вложенные макеты, там есть и ссылки на сценарии, и атрибуты проверки.

Я получаю одинаковые результаты независимо от того, использую ли я стандартную проверку на основе атрибутов или FluentValidation.

Вопросы

  1. Есть ли что-то неправильное в том, как я выполняю раскладку макета? Кажется, он работает нормально, за исключением этой проблемы, но, возможно, я делаю что-то нестандартным образом.

  2. Есть ли параметр в web.config или где-то еще, который мне нужно изменить, чтобы проверка клиента работала для страниц, вложенных более чем на один уровень?

  3. Это ошибка в ASP.NET MVC, о которой я должен сообщить в Microsoft?

1 Ответ

4 голосов
/ 06 мая 2011

попробуйте это для начала: в каждом представлении вверху вы должны убедиться, что у вас есть доступный контекст формы -

@{
if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext();
}

Я на самом деле поместил это в свой _ViewStart.cshtml, потому что загруженные представления ajax потребуютэто для правильной работы проверки время от времени (плюс некоторый другой код) - но попробуйте попробовать ее для вашей проблемы

Я считаю, что ваша проблема в том, что представление не имеет Ajax.BeginForm или Html.BeginForm всамо представление - тогда помощники не будут испускать атрибуты data-val.

...