2

私は自分のアプリで目立たないクライアント側の検証を有効にしました、そして私はこのモデルに(似たようなものを)持っています:

public class MyModel
{
    [Required]
    public string Name { get; set; }

    [Range(0, 100)]
    public int? Age { get; set; }
}

私は次の/ホーム/インデックスビューを持っています:

@model MyModel

@using (Html.BeginForm("Test", "Home"))
{
    <div id="my-form"> 
        @Html.Partial("Model")
    </div>
    <input type="submit" value="Go" />
}

部分的な「モデル」の場合:

@model MyModel

<div>
    @Html.LabelFor(x => x.Name)
    @Html.TextBoxFor(x => x.Name)
    @Html.ValidationMessageFor(x => x.Name)
</div>
<div>
    @Html.LabelFor(x => x.Age)
    @Html.TextBoxFor(x => x.Age)
    @Html.ValidationMessageFor(x => x.Age)
</div>

すべてがおかしなことです、私は素晴らしい検証エラーメッセージを受け取ります。

ここで、フォーム/部分的な「モデル」を動的にロードします。つまり、@ Html.Partialをリモートにして、以下を追加します。

<a href="#" id="load-form">Load the form</a>

<script type="text/javascript">
    $(function () {
        $("#load-form").click(function () {
            $.post(
                "/Home/Test",
                null,
                function (result) {
                    $("#my-form").html(result);
                    $.validator.unobtrusive.parse($("#my-form"));
                },
                "html");
        });
    });
</script>

/ Home/Testは次のように単純です。return Partial("Model", new MyModel());

しかし、クライアント側の検証は機能しなくなり、返されたDOMとHTMLを見ると、データ属性はレンダリングされません。つまり、次のようになります。

/ Home / IndexのHtml.Partial()を使用

<div>    
    <label for="Name">Name</label>    
    <input data-val="true" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" />    
    <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>    
</div>    
<div>    
    <label for="Age">Age</label>    
    <input data-val="true" data-val-number="The field Age must be a number." data-val-range="The field Age must be between 0 and 100." data-val-range-max="100" data-val-range-min="0" id="Age" name="Age" type="text" value="" />    
    <span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true"></span>    
</div>

XHR応答

<div>
    <label for="Name">Name</label>
    <input id="Name" name="Name" type="text" value="" />        
</div>
<div>
    <label for="Age">Age</label>
    <input id="Age" name="Age" type="text" value="" />    
</div>

部分ビューに明示的に追加してもHtml.EnableClientValidation();Html.EnableUnobtrusiveJavaScript();検証はレンダリングされません。

AJAXで検証属性とメッセージを部分的にレンダリングするにはどうすればよいですか?または、他に何が間違っている可能性がありますか?

4

2 に答える 2

1

ああ...簡単です:)

@Html.BeginForm()同じ部分にある必要があります(フォームで検証しているので、これは十分に公平だと思います)。

/ホーム/インデックスビューは次のようになります。

@model MyModel

<div id="my-form"> 
    @Html.Partial("Model")
</div>

部分的な「モデル」の場合:

@model MyModel

@using (Html.BeginForm("Test", "Home"))
{
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.TextBoxFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
    </div>
    <div>
        @Html.LabelFor(x => x.Age)
        @Html.TextBoxFor(x => x.Age)
        @Html.ValidationMessageFor(x => x.Age)
    </div>

    <input type="submit" value="Go" />
}
于 2011-05-25T13:20:05.680 に答える
1

パーシャルにフォームは必要ありません(たとえば、ajaxフォームの場合、ロードするたびに新しいフォームに再バインドする必要がないため、フォームを除外することには利点があります)。

あなたの部分に単に追加します

{ ViewContext.FormContext = new FormContext()} 

属性が書き出されます。

于 2013-09-29T06:22:45.437 に答える