我有一个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.");
}
}
答案 0 :(得分:2)
由于.aspx中设置了ReadOnly
属性,因此当客户端发回的任何更改都将被忽略。如果您绝对需要将文本框设置为只读,那么从.aspx中删除该属性并在页面加载时使用JavaScript设置它:
$(document).ready(function () {
$('#<%= txtMailAddressZipCode.ClientID%>').prop('readonly', true);
});
这样用户将无法直接更改文本框(我假设您有其他方式填充文本框),但任何更改都将被回发而不是原始(空)值。