在Javascript中插入文本框值不会通过ASP.NET验证

时间:2014-12-30 17:48:15

标签: javascript jquery asp.net validation webforms

我有一个ASP.NET 4.5 Web表单,其中包含物理和邮寄地址的输入。输入实际地址后,如果信息相同,用户可以勾选复选框以填写邮寄地址。

这是通过与复选框绑定的OnClick功能实现的,基本上这样做(我遗漏了额外的代码): document.getElementById("<%= txtMailAddressStreetNumber.ClientID%>").value = document.getElementById("<%= txtPermAddressStreetNumber.ClientID%>").value;

每个地址文本框都有一个RequiredFieldValidator。当我提交表单时,它会通过客户端验证并发回服务器。它失败了(Page.IsValid是假的)。除非我手动填充它们,否则OnClick功能填充的文本框将无法通过服务器端验证。

我在分配值后尝试调用Page_ClientValidate('FormGroup');(FormGroup是验证组的名称),这样做不会触发文本框的任何验证错误消息。但是,当我提交表单(回发)时,通过Javascript插入的值都被清除,我必须手动输入它们。

.aspx页面中的代码:

<asp:Label CssClass="mainlabel" ID="lblPermAddressZipCode" runat="server" Text="Zip Code" AssociatedControlID="txtPermAddressZipCode" />
<asp:RequiredFieldValidator ControlToValidate="txtPermAddressZipCode" ID="RequiredFieldValidator10" runat="server" ErrorMessage="*" Display="Dynamic" ValidationGroup="FormGroup" CssClass="formerror" />
<asp:TextBox ID="txtPermAddressZipCode" Width="100" onclick="openDialog(1)" ReadOnly="true" CssClass="readOnlyTextBox" runat="server" />

<asp:CheckBox ID="cbPermIsMailAddress" onclick="UsePermanentAsMailingAddress()" runat="server" /><small>(same as above)</small>

<asp:Label CssClass="mainlabel" ID="lblMailAddressZipCode" runat="server" Text="Zip code" AssociatedControlID="txtMailAddressZipCode" />
<asp:RequiredFieldValidator ControlToValidate="txtMailAddressZipCode" ID="RequiredFieldValidator15" runat="server" ErrorMessage="*" Display="Dynamic" ValidationGroup="FormGroup" CssClass="formerror" />
<asp:TextBox ID="txtMailAddressZipCode" ReadOnly="true" onclick="openDialog(2)" CssClass="readOnlyTextBox" Width="100" runat="server" />

使用Javascript:

function UsePermanentAsMailingAddress() {
    //only copy if the address is complete

    if (document.getElementById("<%= permCityStateZipId.ClientID %>").value != '') {

        //exit if the box was unchecked
        if (!$("#<%= cbPermIsMailAddress.ClientID%>").is(':checked')) {
            return;
        }

        document.getElementById("<%= txtMailAddressZipCode.ClientID%>").value = document.getElementById("<%= txtPermAddressZipCode.ClientID%>").value;
        //the ID value is the answer
        document.getElementById("<%= mailCityStateZipId.ClientID%>").value = document.getElementById("<%= permCityStateZipId.ClientID %>").value;

        //Page_ClientValidate('FormGroup');
    }
    else {
        $("#<%= cbPermIsMailAddress.ClientID%>").removeAttr('checked');
        alert("Please enter a complete permanent address first.");
    }
}

1 个答案:

答案 0 :(得分:2)

由于.aspx中设置了ReadOnly属性,因此当客户端发回的任何更改都将被忽略。如果您绝对需要将文本框设置为只读,那么从.aspx中删除该属性并在页面加载时使用JavaScript设置它:

$(document).ready(function () {
     $('#<%= txtMailAddressZipCode.ClientID%>').prop('readonly', true);
});

这样用户将无法直接更改文本框(我假设您有其他方式填充文本框),但任何更改都将被回发而不是原始(空)值。