0

私は自分の問題を説明できることを願って、小さなテストプロジェクトを立ち上げました。Child型のすべての子を含むプロパティを持つ親クラスがあります。MVCビューでは、テーブル内のすべての子を一覧表示し、フォームに子をポストバックさせて、子を親プロパティに自動的にマップするために、次のようにレンダリングします。

@Html.TextBox(string.Format("Children[{0}].ChildName", childIndex), child.ChildName)

コントローラで、プロパティChildNameを必須としてマークしました。私が抱えている問題は、jqueryの控えめな検証ではデータ検証属性が出力されないことです。サーバーではすべてが正常に検証されますが、クライアントでは検証されません(明らかに、これらの入力で検出するjquery検証の属性がないため)。

コードを見てください:

見る

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <form action="@Url.Action("Save")" method="post">
            @Html.TextBox("Name", (string)Model.Name)

            <table>
                <tr><td>Child name</td></tr>
                @{var childIndex = 0;}
                @foreach (var child in (List<GridValidationTest.Controllers.Child>)Model.Children)
                {
                    <tr><td>@Html.TextBox(string.Format("Children[{0}].ChildName", childIndex), child.ChildName)</td></tr>
                    childIndex++;
                }
            </table>

            <br /><button>Submit</button>
        </form>
    </div>
</body>
</html>

コントローラ

namespace GridValidationTest.Controllers
{
    public class Parent
    {
        [Required]
        public string Name { get; set; }
        public IList<Child> Children { get; set; }
    }

    public class Child
    {
        [Required]
        public string ChildName { get; set; }
    }

    public class MyController : Controller
    {
        //
        // GET: /My/

        public ActionResult Index()
        {
            var parent = new Parent { Name = "Parent name" };
            parent.Children = new List<Child>
            {
                new Child {ChildName = "First child"},
                new Child {ChildName = "Second child"}
            };
            return View("Index", parent);
        }

        public ActionResult Save(Parent parent)
        {
            return View("Index", parent);
        }

    }
}

親クラスのプロパティ名に対するクライアント検証は、期待どおりに正常に機能します。期待どおりに機能するように、クライアント側の検証を行うように子をどのようにレンダリングする必要がありますか?

4

1 に答える 1

1

ビューのフィールドをモデルにバインドする必要があります。使用する代わりに:

@Html.TextBox(string.Format("Children[{0}].ChildName", childIndex), child.ChildName)

使用する

@Html.TextBoxFor(model => model.Children[childIndex])
@Html.ValidationMessageFor(model => model.Children[childIndex])

また、ページに適切なjqueryjavascriptファイルが含まれていることを確認してください。何かのようなもの:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<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>

また、Web構成で、ClientValidationEnabledとUnobtrusiveJavaScriptEnabledが次のようにオンになっていることを確認してください。

<appSettings>
    ....
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    ....
</appSettings>
于 2013-01-10T14:02:43.967 に答える