6

ページに 2 つのフォームがあります。ASP.NET MVC フレームワークによって自動的に生成されるため、最初のフォームで目立たない検証を使用する必要があります。ただし、目立たない検証を使用しないでください。

ここにいくつかのコードがあります:

@using (Html.BeginForm("Add", "Contacts", FormMethod.Post, new { id = "AddForm" }))
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Datos Contacto</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.ContactDepartmentID)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ContactDepartmentID, (List<SelectListItem>)ViewBag.ContactDepartments)
            @Html.ValidationMessageFor(model => model.ContactDepartmentID)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Sex)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Sex, (List<SelectListItem>)ViewBag.Sexs)
            @Html.ValidationMessageFor(model => model.Sex)
        </div>
    </fieldset>
    <br />
    @Html.HiddenFor(model => model.SerializedEmails, new { data_bind = "value: ko.toJSON($root.emails())" })
    @Html.HiddenFor(model => model.SerializedPhones, new { data_bind = "value: ko.toJSON($root.phones())" })
}
<form id="phoneForm" >
<fieldset>
    <legend>Teléfonos</legend>
    <table class="table">
        <tbody data-bind="foreach: phones">
            <tr>
                <th>
                    Celular?
                </th>
                <th>
                    Phone
                </th>
                <th>
                    Extension
                </th>
                <th>
                </th>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" data-bind="checked: isMobile" />
                </td>
                <td>
                    <input class="phone" data-bind='value: phone'/>
                </td>
                <td>
                    <input type="text" class="extension" data-bind='value: phoneExtension, enable: !isMobile() ' />
                </td>
                <td>
                    <a href='#' data-bind='click: $root.removePhone'>Delete</a>
                </td>
            </tr>
        </tbody>
    </table>
    <a href='#' data-bind='click: $root.addPhone'>Agregar teléfono</a>
</fieldset>
</form>
<p>
    <button onclick="Submit();" type="button" class="btn btn-primary" data-bind='enable: phones().length > 0 || emails().length > 0'>
        Create</button>
</p>

JS:

function Submit()
{      
  var valid = $('#AddForm').valid();     
  var valid2 =  $('#phoneForm').valid();     
}

jQuery.validator.addClassRules("phone", {
  required: true
});

補足として: ページから目立たない検証を削除すると、2 番目のフォームは検証されますが、最初のフォームは検証されません。目立たない検証を使用すると、最初のフォームは検証されますが、2 番目のフォームは検証されません。

クライアント側で検証全体を実行できることはわかっています。それが唯一の方法である場合は、実行します。目立たない検証を引き続き使用する方法を考えていましたが、カスタム属性などを使用して条件付きで無効にできるようにしました。

4

3 に答える 3

0

を削除するunobtrusive-validationと、単に jQuery Validate プラグインを単独で使用していることになります。

その場合は、プラグインのドキュメントに従う必要があります。 このメソッドは、メソッド.valid()によってプラグインが最初に初期化された後にのみ使用できます.validate()。参照: http://jqueryvalidation.org

ただし、submit関数またはハンドラー内に何かをラップする必要はありません。プラグインが適切に初期化されている場合、プラグインは送信イベントを自動的にキャプチャします。

$(document).ready(function() {

    $('#myform').validate({
        // rules and options
    });

    jQuery.validator.addClassRules("phone", {
         required: true
    });

});

簡単なデモ: http://jsfiddle.net/DW4qE/

于 2013-08-09T17:30:34.447 に答える