Вложенные макеты Razor, вызывающие сбой проверки клиента

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

@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?


person devuxer    schedule 06.05.2011    source источник


Ответы (1)


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

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

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

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

person Adam Tuliper - MSFT    schedule 06.05.2011
comment
Вау, отличный призыв к этому. Я поместил код FormContext в свой _ViewStart, и он сработал как шарм. Одна вещь, которая меня озадачивает ... почему бы движку, который генерирует html из файлов cshtml, просто сначала не объединить все макеты в один файл, а затем выполнить оставшуюся обработку? Это гарантирует, что вы получите одинаковые результаты независимо от того, есть ли у вас вложенные макеты или нет. По крайней мере, обходной путь прост. Спасибо! - person devuxer; 06.05.2011
comment
Вероятно, потому, что помощники думают, что у вас «должна» быть форма для всего, что вам нужно проверить, потому что для проверки требуется сообщение формы... хотя в некоторых случаях я не думаю, что это правильный путь. Так же, как помощники html ведут себя немного иначе, чем вы думаете, когда вы повторно отображаете данные после публикации: stackoverflow.com/questions/3544663/ - person Adam Tuliper - MSFT; 06.05.2011