如何使用jquery验证元素列表

时间:2015-07-24 07:19:07

标签: javascript jquery validation spring-mvc spring-form

这是我的表单,其中包含childrenDetails列表。我可以验证除此列表之外的所有其他属性。请帮忙

<form:form commandName="family"
    action="${pageContext.request.contextPath}/user/family" method="POST"
    id="family-form" novalidate="novalidate">
    <table>
        <tr>
            <c:set var="marraigeStat" value="married" />
            <c:if test="${personalDetials.marriageStatus eq marraigeStat}">
                <tr>
                    <td><form:label path="spousesName">Name of Spouse</form:label>
                    </td>
                    <td><form:input path="spousesName" id="spousesName" /></td>
                </tr>
                <tr>
                    <td><form:label path="spousesAge">Spouses Age</form:label>
                    <td><form:input path="spousesAge" id="spousesAge" />
                </tr>
                <tr>
                    <td><form:label path="weddingDate">Wedding Date</form:label></td>
                    <td><form:input path="weddingDate" type="date"
                            name="weddingDate" id="weddingDate" /></td>
                    <td><form:errors path="weddingDate" /></td>
                </tr>
            </c:if>
        </tr>
        <tr>
            <td><form:label path="fatherName">Father Name</form:label></td>
            <td><form:input path="fatherName" id="fatherName" /></td>
        </tr>
        <tr>

            <td><form:label path="motherName">Mother Name</form:label></td>
            <td><form:input path="motherName" id="motherName" /></td>
        </tr>
        <tr>
            <td><form:label path="fatherAge">Father Age</form:label></td>
            <td><form:input path="fatherAge" type="date" name="fatherAge"
                    id="fatherAge" /></td>
        </tr>
        <tr>
            <td><form:label path="motherAge">Mother Age</form:label></td>
            <td><form:input path="motherAge" type="date" name="motherAge"
                    id="motherAge" /></td>
        </tr>

        <tr>
            <c:set var="childerStat" value="true" />
            <c:if test="${personalDetials.childerStatus eq childerStat}">

                <h5>child should be there</h5>

                <c:forEach items="${family.childrenDetails}" varStatus="status">
                    <tr>
                        <td><form:label
                                path="childrenDetails[${status.index}].childName"> Child Name</form:label>
                        <td><form:input
                                path="childrenDetails[${status.index}].childName" id="childName" /></td>

                        <td><form:label
                                path="childrenDetails[${status.index}].childGender">Child Gender</form:label>
                        </td>
                        <td><form:radiobutton
                                path="childrenDetails[${status.index}].childGender" value="male"
                                label="male" id="childGender" /></td>
                        <td><form:radiobutton
                                path="childrenDetails[${status.index}].childGender"
                                value="female" label="female" id="childGender" /></td>
                        <td><form:radiobutton
                                path="childrenDetails[${status.index}].childGender"
                                value="others" label="others" id="childGender" /></td>
                        <td><form:label
                                path="childrenDetails[${status.index}].childDob">Child Date of Birth</form:label></td>
                        <td><form:input
                                path="childrenDetails[${status.index}].childDob" type="date" id="childDob"/></td>

                        <td><form:label
                                path="childrenDetails[${status.index}].childCompanyName">Child Company Name</form:label></td>
                        <td><form:input
                                path="childrenDetails[${status.index}].childCompanyName" id="childCompanyName" /></td>

                        <td><form:label
                                path="childrenDetails[${status.index}].childPosition">Child Position</form:label></td>
                        <td><form:input
                                path="childrenDetails[${status.index}].childPosition" id="childPosition" /></td>
                    </tr>

                </c:forEach>
                <tr>
                    <c:if test="${familyDetails.getChildrenDetails().size()!=0 }">
                    <td><form:button name="submit" value="ADD">ADD</form:button></td>
                    <td><form:button name="submit" value="REMOVE">REMOVE</form:button></td>
                    </c:if>
                </tr>
            </c:if>



            <c:if test="${family.childrenDetails != null }">
                <tr>
                    <td><h2>CHILD DISPLAY</h2></td>
                <tr>
                    <th>Child Name</th>
                    <th>childGender</th>
                    <th>childDob</th>
                    <th>childCompanyName</th>
                    <th>childPosition</th>
                </tr>
                <tr>
                    <c:forEach items="${family.childrenDetails}" var="child"
                        varStatus="status">
                        <tr>
                            <td>${child.childName}</td>
                            <td>${child.childGender}</td>
                            <td>${child.childDob}</td>
                            <td>${child.childCompanyName}</td>
                            <td>${child.childPosition}</td>
                        </tr>
                    </c:forEach>
                </tr>
            </c:if>
        </tr>

在有能力的代码中,我必须知道子项详细信息,其中我为列表的每个属性分配了id。 现在在这个id的帮助下,我正在尝试验证这些字段。 我的验证不仅适用于家庭内的childrenDetails列表。 这是我的javascript验证

$(function() {
    $("#family-form").validate({

        rules : {
            spousesName : "required",
            spousesAge : "required",
            weddingDate : "required",
            fatherName : "required",
            motherName : "required",
            fatherAge : "required",
            motherAge : "required",
            childName : "required",
            childGender : "required",
            childDob : "required",
            childCompanyName :  "required",
            childPosition : "required"

        },
        messages : {
            spousesName : "please enter your spouses name",
            spousesAge : "Please enter the age of your spouses",
            weddingDate : "what is your wedding date",
            fatherName : "please enter your father name",
            motherName : "please enter your mother name",
            fatherAge : "please enter your father age",
            motherAge : "please enter your mothers age",
            childName : "required",
            childGender : "required",
            childDob : "required",
            childCompanyName :  "required",
            childPosition : "required"

        },
        submitHandler : function(form) {
            form.submit();
        }

    });
});
function goBack(){
    window.history.back();
}

请帮忙。提前致谢

1 个答案:

答案 0 :(得分:1)

验证无效后可能有两个原因。

  1. id的唯一性:主要问题
  2. 动态元素:JavaScript正在创建新的子级详细信息。即在生成ADD按钮后,将生成新的表单块:可能是问题
  3. 案例UN唯一性

    好的,问题在于DOM中id的UN唯一性。因此,基本原则是id属性在整个渲染文档中应该是唯一的。

    <c:forEach items="${family.childrenDetails}" varStatus="status">
        <tr>
            <td>
                <form:label path="childrenDetails[${status.index}].childName">Child Name</form:label>
                <td>
                    <form:input path="childrenDetails[${status.index}].childName" id="childName" />
                </td>
                <td>
                    <form:label path="childrenDetails[${status.index}].childGender">Child Gender</form:label>
     //So In this block childName id will be duplicate if more than one children exists
    

    因此,以下是id重复时遇到的类似问题的示例:

    JSFIDDLE DEMO 1

    因此,解决方案是使用class选择器而不是id进行验证。你可以用作:

        $('#family-form').validate({ 
                rules : {
                spousesName : "required",
                spousesAge : "required",
                weddingDate : "required",
                fatherName : "required",
                motherName : "required",
                fatherAge : "required",
                motherAge : "required",
            },
            messages : {
                spousesName : "please enter your spouses name",
                spousesAge : "Please enter the age of your spouses",
                weddingDate : "what is your wedding date",
                fatherName : "please enter your father name",
                motherName : "please enter your mother name",
                fatherAge : "please enter your father age",
                motherAge : "please enter your mothers age",
            },
                submitHandler : function(form) {
                form.submit();
            }
            });
    
            $('.childNameValidation').each(function() {
                $(this).rules('add', {
                    required: true,
                    messages: {
                        required:  "Child Name is invalid",
                    }
                });
            });
    

    虽然为每个其他元素定义这样的内容可能很忙。但是,它应该做的工作。

    需要包含:http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.0/additional-methods.js

    JSFIDDLE DEMO 2

    CASE动态元素

    请遵循:Adding jQuery validator rules to dynamically created elements in ASP

    问题的不同Appraoch

    此问题的最简单解决方案可能是在表单元素本身上使用data-attribute

    请参阅:Declaring jQuery Validate plugin rules -- attribute vs. class vs. code

    上面提到的解决方案只是我直观的猜测。因此,它可能会或可能不会解决您所面临的问题。