使用Javascript / Jquery动态验证ASP.NET控件

时间:2014-06-30 04:54:13

标签: javascript jquery asp.net vb.net validation

我有多个控件需要根据一个条件进行验证:如果三个控件中的一个具有值,则第四个控件也必须包含值。我有4组4个控件,每个控件编号从1到4。我已经编写了一个快速而又脏的函数来进行验证,但是代码本身是不圣洁的,并且违反了大部分良好代码设计的原理,它真的很难看。

JavaScript验证

$(document).ready(function () {
           $("#<%= submitBtn.ClientID%>").click(function () {
            var errorMessage = "";
            var error = false;

            var firstname1 = document.getElementById("<%=child1FN.ClientID%>").value;
            var surname1 = document.getElementById("<%=child1LN.ClientID%>").value;
            var relation1 = document.getElementById("<%=ddlRelationship1.ClientID%>").value;
            var dob1 = document.getElementById("<%=DoB1.ClientID%>");
            if ((firstname1 != "" || surname1 != "" || relation1 != "") && dob1.value == "") {
                errorMessage += "First DoB needs to be filled. \n";
                error=true;
            }

            var firstname2 = document.getElementById("<%=child2FN.ClientID%>").value;
            var surname2 = document.getElementById("<%=child2LN.ClientID%>").value;
            var relation2 = document.getElementById("<%=ddlRelationship2.ClientID%>").value;
            var dob2 = document.getElementById("<%=DoB2.ClientID%>");
            if ((firstname2 != "" || surname2 != "" || relation2 != "") && dob2.value == "") {
                errorMessage += "Second DoB needs to be filled. \n";
                error=true;
            }
            var firstname3 = document.getElementById("<%=child3FN.ClientID%>").value;
            var surname3 = document.getElementById("<%=child3LN.ClientID%>").value;
            var relation3 = document.getElementById("<%=ddlRelationship3.ClientID%>").value;
            var dob3 = document.getElementById("<%=Dob3.ClientID%>");
            if ((firstname3 != "" || surname3 != "" || relation3 != "") && dob3.value == "") {
                errorMessage += "Third DoB needs to be filled. \n";
                error=true;
            }

            var firstname4 = document.getElementById("<%=child4FN.ClientID%>").value;
            var surname4 = document.getElementById("<%=child4LN.ClientID%>").value;
            var relation4 = document.getElementById("<%=ddlRelationship4.ClientID%>").value;
            var dob4 = document.getElementById("<%=DoB4.ClientID%>");
            if ((firstname4 != "" || surname4 != "" || relation4 != "") && dob4.value == "") {
                errorMessage += "Fourth DoB needs to be filled. \n";
                error=true;
            }

            if (error) {
                alert(errorMessage);
                return false;
            }
        });
    });

问题是,我不能使用for循环,因为asp不接受以下来源的javascript值

<tr>
                 <th>
                        Child one:
                    </th>
                </tr>
                <tr>
                    <td>
                        <asp:TextBox ID="child1FN" runat="server" />
                    </td>
                    <td>
                        <asp:TextBox ID="child1LN" runat="server" />
                    </td>
                    <td>
                        <asp:DropDownList ID="ddlRelationship1" runat="server" ></asp:DropDownList>
                    </td>
                    <td>
                        <telerik:RadDatePicker ID="DoB1" runat="server" Culture="English (Australia)" MinDate="1 Jan 1920" class="datePickerDOB">
                        </telerik:RadDatePicker>
                    </td>
                </tr>

                <tr>
                    <th>
                        Child two:
                    </th>
                </tr>

                <tr>
                    <td>
                        <asp:TextBox ID="child2FN" runat="server" />
                    </td>
                    <td>
                        <asp:TextBox ID="child2LN" runat="server" />
                    <td>
                        <asp:DropDownList ID="ddlRelationship2" runat="server"></asp:DropDownList>
                    </td>
                    <td>
                        <telerik:RadDatePicker ID="DoB2" runat="server" Culture="English (Australia)" MinDate="1 Jan 1920" class="datePickerDOB">
                        </telerik:RadDatePicker>
                    </td>
                </tr> . . .

我只显示了源的前两行,这些行已经过简化并删除了样式标记以便易读。就像我写的那样;有4行,它们与上面的代码类似,只有不同的ID。

我想知道是否有人有任何改进此代码的建议?

呈现Telerick代码

<span class="riSingle RadInput RadInput_MetroTouch" id="ctl00_cphBody_DoB1_dateInput_wrapper" style="width: 100%; display: block;">
    <input name="ctl00$cphBody$DoB1$dateInput" class="riTextBox riEnabled" id="ctl00_cphBody_DoB1_dateInput" style="padding-left: 2px; font-size: 12px;" type="text">
    <input name="ctl00_cphBody_DoB1_dateInput_ClientState" id="ctl00_cphBody_DoB1_dateInput_ClientState" type="hidden" value='{"enabled":true,"emptyMessage":"","validationText":"","valueAsString":"","minDateStr":"20202020-JanJan-0101-0000-0101-0000","maxDateStr":"99999999-DecDec-3131-0000-1212-0000","lastSetTextBoxValue":""}' autocomplete="off">
</span>

1 个答案:

答案 0 :(得分:0)

为容器提供一个ID,这将使您的生活更容易使用jQuery(并且比使用类等作为选择器更有效)。另外,在“数据”行中添加一个类

<table id="formElements">
     <tr><th>Child 1</th></tr>
     <tr class="data"><!-- Form Elelemt Cells --></tr>
     <!-- etc -->
</table>

的Javascript

$(document).ready(function () {
    var formTable = $("#formElements");
    /*console.log(formTable);  */


    $("#submitBtn").click(function (index) {
    var errorMessage = "";
    var error = false;

    //Use the fact we have the elements in a row to our advantage
    $(formTable).find("tr.data").each(function (index) {
        var firstName = $(this).find("td:nth-child(1) input").val();
        var lastName = $(this).find("td:nth-child(2) input").val();
        var relationship = $(this).find("td:nth-child(3) select").val();
        //Taking a punt the value is in the hidden form field for DOB;
        var dob = $(this).find("td:nth-child(4) input[type='hidden']").val();

        //Use console to try and work out what telrik uses to hold the data
        console.log($(this).find("td:nth-child(4) input[type='hidden']"));
        console.log($(this).find("td:nth-child(4) input[type='text']"));

        if ((firstName != "" || lastName != "" || relationship != "") && dob == "") {
            errorMessage += "DoB " + (index + 1) + " needs to be filled. \n";
            error = true;
        }
   });

   if (error) {
       alert(errorMessage);
       return false;
   }
  });
});

这有点快,很脏,处理telrick控件可能很棘手。

Demo

如果您可以使用ASP.net inbuild验证程序来验证telrik控件,那么最好使用它们。即使是stil,使用自定义ASP.net验证器也应该在类似的情况下工作。

更新

我使用console.log添加了几个调试行来尝试帮助telrik控件。

严厉的hacky版本

按上述方式保留HTML。

的Javascript

$(document).ready(function () {
    var formTable = $("#formElements");
    /*console.log(formTable);  */

    //Create an array of the DatePicker controls
    //You could replace the jQuery selectro with:
    //document.getElementById("<%=DoB1.ClientID%>")
    var arrDoB = new Array( 
                     $("#<%=DoB1.ClientID%>"),
                     $("#<%=DoB2.ClientID%>"),
                     $("#<%=DoB3.ClientID%>"),
                     $("#<%=DoB4.ClientID%>")
                 );

    $("#submitBtn").click(function (index) {
    var errorMessage = "";
    var error = false;

    //Use the fact we have the elements in a row to our advantage
    $(formTable).find("tr.data").each(function (index) {
        var firstName = $(this).find("td:nth-child(1) input").val();
        var lastName = $(this).find("td:nth-child(2) input").val();
        var relationship = $(this).find("td:nth-child(3) select").val();

        //Get the value of the datepicker control from the array
        var dob = arrDoB[index].value;

        if ((firstName != "" || lastName != "" || relationship != "") && dob == "") {
            errorMessage += "DoB " + (index + 1) + " needs to be filled. \n";
            error = true;
        }
   });

   if (error) {
       alert(errorMessage);
       return false;
   }
  });
});