嵌套Razor布局导致客户端验证失败

时间:2011-05-06 02:10:58

标签: asp.net-mvc validation asp.net-mvc-3 razor fluentvalidation

这是我原来的创建页面(没有嵌套) - 客户端验证工作

@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. 这是我应该向Microsoft报告的ASP.NET MVC中的错误吗?

1 个答案:

答案 0 :(得分:4)

为初学者尝试这个: 在顶部的每个视图中,您需要确保您有一个表单上下文 -

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

我实际上把它放在我的_ViewStart.cshtml中,因为ajax加载的视图需要这个以便验证有时正常工作(加上一些其他代码) - 但试试你的问题

我相信你的问题是视图本身没有Ajax.BeginForm或Html.BeginForm - 然后帮助者不会发出data-val属性。