我有一个表单,用户应该能够通过输入地址(在个别街道、城市、国家、州字段中)或公司内部用于描述数据的 4 个特定代码之一来搜索数据。
我已经为地址字段分配了一个类名(根据验证规则),而特殊代码字段则是另一个。
我的问题是,如果另一个组的字段都已填写,我无法弄清楚如何不需要这两个组中的一个或另一个。IE - 如果用户填写了所有地址字段,则不应要求他填写在任何特殊代码文本框中,反之,如果用户填写其中一个特殊代码,则不应要求她填写地址值。
我正在使用 C# 和 jQuery Validate 1.11 - 修复了原始的 require_from_group 函数,该函数解决了在初始组验证(或类似的东西)后跳过所有验证的报告问题。
以下是显示相关字段的表单上的代码:
<div class="evenFormPaddedWide mb" style="max-width:575px;">
<label>Address</label><br />
<div class="pDiv">
<div class="elementDiv">
<label>Street</label><br />
<asp:TextBox id="txtAddress" runat="server" Width="250px" MaxLength="65" CssClass="GroupAddress"></asp:TextBox>
</div>
<div class="elementDiv">
<label>City</label><br />
<asp:TextBox id="txtCity" runat="server" Width="120px" MaxLength="60" CssClass="GroupAddress"></asp:TextBox>
</div>
</div>
<div class="pDiv">
<div class="elementDiv">
<label>Country</label><br />
<asp:DropDownList ID="ddlCountries" CssClass="GroupAddress" runat="server" DataValueField="CountryCode" DataTextField="CountryName" AutoPostBack="true" OnSelectedIndexChanged="ddlCountries_SelectedIndexChanged"></asp:DropDownList>
</div>
<div class="elementDiv">
<asp:UpdatePanel ID="pnlStates" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlCountries" EventName="SelectedIndexChanged"/>
</Triggers>
<ContentTemplate>
<label>State</label><br />
<asp:DropDownList ID="ddlStates" CssClass="GroupAddress" runat="server" DataValueField="GeopoliticalCode" DataTextField="GeopoliticalName"></asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<div class="formLine"></div>
<div class="pDiv">
<div class="elementDiv">
<label>CLLI Code</label><br />
<asp:TextBox id="txtClliCode" runat="server" Width="100px" MaxLength="11" CssClass="GroupIDCodes"></asp:TextBox>
</div>
<div class="elementDiv">
<label>Site Code</label><br />
<asp:TextBox id="txtSiteCode" runat="server" Width="100px" MaxLength="8" CssClass="GroupIDCodes"></asp:TextBox>
</div>
<div class="elementDiv">
<label>F&E Location Code</label><br />
<asp:TextBox ID="txtLocationCode" runat="server" MaxLength="10" Columns="12" CssClass="GroupIDCodes"></asp:TextBox>
</div>
<div class="elementDiv">
<label>MUX Code</label><br />
<asp:TextBox id="txtMuxCode" runat="server" Width="50px" MaxLength="3" CssClass="GroupIDCodes"></asp:TextBox>
</div>
</div>
<div class="formLine"></div>
<div class="fr">
<asp:Button id="btnSubmit" runat="server" Text="Search" onclick="btnSubmit_Click"></asp:Button>
<asp:Button id="btnClear" runat="server" Text="Clear" onclick="btnClear_Click" CausesValidation="False" CssClass="cancel"></asp:Button>
</div>
</div>
以下是我使用 require_from_group2 函数的方式:
$(function () {
jQuery.validator.messages.required = "";
$('#userInputForm').validate({
rules: {
txtAddress: {
minlength: 6,
require_from_group2: [4, ".GroupAddress"]
},
txtCity: { require_from_group2: [4, ".GroupAddress"] },
ddlCountries: { require_from_group2: [4, ".GroupAddress"] },
ddlStates: { require_from_group2: [4, ".GroupAddress"] },
txtClliCode: { require_from_group2: [1, ".GroupIDCodes"] },
txtSiteCode: { require_from_group2: [1, ".GroupIDCodes"] },
txtLocationCode: { require_from_group2: [1, ".GroupIDCodes"] },
txtMuxCode: { require_from_group2: [1, ".GroupIDCodes"] }
},
//End rules
groups: {
Address: "txtAddress txtCity ddlCountries ddlStates",
OtherCodes: "txtClliCode txtSiteCode txtLocationCode txtMuxCode"
},
//End groups
messages: {
txtAddress: { minlength: "Street requires at least 6 characters", require_from_group2: "All address fields are required when searching by address" },
txtCity: { require_from_group2: "All address fields are required when searching by address" },
ddlCountries: { require_from_group2: "All address fields are required when searching by address" },
ddlStates: { require_from_group2: "All address fields are required when searching by address" },
txtClliCode: { require_from_group2: "At least one of the bottom 4 code fields must be provided if not searching by address" },
txtSiteCode: { require_from_group2: "At least one of the bottom 4 code fields must be provided if not searching by address" },
txtLocationCode: { require_from_group2: "At least one of the bottom 4 code fields must be provided if not searching by address" },
txtMuxCode: { require_from_group2: "At least one of the bottom 4 code fields must be provided if not searching by address" }
},
//End messages
errorLabelContainer: "#errorMessageDetailContainerLeft"
});
});
以防万一,这里是固定的 require_from_group:
jQuery.validator.addMethod("require_from_group2", function (value, element, options) {
var validator = this;
var minRequired = options[0];
var selector = options[1];
var validOrNot = jQuery(selector, element.form).filter(function () {
return validator.elementValue(this);
}).length >= minRequired;
// remove all events in namespace upload
jQuery(selector, element.form).off('.require_from_group2');
if (this.settings.onkeyup) {
jQuery(selector, element.form).on({
'keyup.require_from_group2': function (e) {
jQuery(selector, element.form).valid();
}
});
}
if (this.settings.onfocusin) {
jQuery(selector, element.form).on({
'focusin.require_from_group2': function (e) {
jQuery(selector, element.form).valid();
}
});
}
if (this.settings.click) {
jQuery(selector, element.form).on({
'click.require_from_group2': function (e) {
jQuery(selector, element.form).valid();
}
});
}
if (this.settings.focusout) {
jQuery(selector, element.form).on({
'focusout.require_from_group2': function (e) {
jQuery(selector, element.form).valid();
}
});
}
return validOrNot;
}, jQuery.format("Please fill at least {0} of these fields."));
任何帮助当然不胜感激!