1

これが私の元の作成ページです(ネストなし)-クライアント検証が機能します

@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. レイアウトのネスティングのやり方が間違っていますか? この 1 つの問題を除いては正常に動作しているように見えますが、標準的ではない方法で作業を行っている可能性があります。

  2. 1 レベル以上の深さでネストされたページに対してクライアント検証を機能させるために変更する必要がある web.config または他の場所に設定はありますか?

  3. これは Microsoft に報告すべき ASP.NET MVC のバグですか?

4

1 に答える 1

4

初心者のためにこれを試してください:上部の各ビューで、フォームコンテキストが利用可能であることを確認する必要があります-

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

私は実際にこれを_ViewStart.cshtmlに入れました。なぜなら、ajaxでロードされたビューは、検証が時々正しく機能するためにこれを必要とするからです(そして他のコードも)-しかし、あなたの問題を試してみてください

あなたの問題は、ビュー自体にAjax.BeginFormまたはHtml.BeginFormがない場合、ヘルパーはdata-val属性を出力しないことだと思います。

于 2011-05-06T03:14:10.670 に答える