我有一个asp.net表单,其中包含一个下拉列表,该列表在更改时回发到服务器并填充第二个下拉列表,其中包含一些日期。
表单还包含其他一些字段,其中一些是经过验证的客户端和一些服务器端。
这是我遇到的问题。如果我收到客户端验证错误,则尝试更改下拉列表,第二个下拉列表不会填充。如果我再次更改第一个下拉列表,它将按预期工作。
这是我的提交按钮:
<asp:Button ID="btnSubmit" Text="Submit" runat="server" OnClientClick="Page_ClientValidate(); return checkPassengers();" OnClick="Page_Transfer" ValidationGroup="FormSubmit" />
这是我的客户端验证:
function checkPassengers() {
if($("#testField").val() == "Name *" || $("#testField").val() == "") {
$("#pltester").prepend("<p class='fillall'>Please fill in all fields marked with *</p>");
return false;
}
};
Dropdowns的:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddl1st" EventName="SelectedIndexChanged" />
</Triggers>
<ContentTemplate>
<asp:DropDownList ID="ddl1st" Width="190" AutoPostBack="true" OnSelectedIndexChanged="ChooseDates1st" runat="server" />
<asp:DropDownList ID="ddlDepart1st" AutoPostBack="true" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
答案 0 :(得分:4)
在使用updatepanels之前,我多次遇到过这个问题。
我发现如果需要对字段进行验证,那么您必须在元素上实际设置CausesValidation="true"
才能使用updatepanels。
希望这会帮助你!
答案 1 :(得分:3)
简单地设置CausesValidation="true"
并没有为我解决问题。使用asp下拉列表的SelectedIndexChange事件时,这似乎是个问题。
我找到的解决方法是通过在回发之前验证不存在的验证组名称来使用js重置前端验证。
function ignoreValidation() {
if (typeof Page_ClientValidate != 'undefined') {
Page_ClientValidate('reset-validation');
Page_BlockSubmit = false;
}
return true;
}
对于下拉列表
<asp:DropDownList CausesValidation="false" onchange="ignoreValidation();" runat="server" ID="CustomerDropDownList" OnSelectedIndexChanged="LoadCustomers" AutoPostBack="true"/>
答案 2 :(得分:1)
如果不需要验证下拉列表,可以在初始下拉列表中设置CausesValidation="false"
。这将导致它不会触发验证,因此可以随意更改。
或者,您可以将DropDownList放在不同的ValidationGroup中,以便更改它不会触发其他控件的验证。
答案 3 :(得分:0)
function validateCommand(group) {
if (typeof (Page_ClientValidate) == 'function') {
Page_ClientValidate(group);
if (Page_IsValid) {
Page_BlockSubmit = !confirm('Are you sure?');
}
}
}