jQueryvalidation – 一个asp.net表单上的多个提交按钮,不同的validation组?
我有一个带有登录部分和注册部分的asp.net表单。 有两个提交按钮对应于相应的部分,登录或注册。 我正在使用jqueryvalidation,但是我找不到像通常的asp.netvalidation那样指定validation组的方法。 当我点击注册按钮时,它现在要求填写登录字段。任何人对此有何想法? 谢谢!
我猜你正在使用这个validation插件: JQuery Validation 。 该插件使用表单标记作为validation组,因此要完成您想要的操作,您需要根据用户推送的按钮删除规则。 此外,您需要为validation失败的情况添加规则,然后用户决定单击其他按钮。
这是一个例子:
$(document).ready(function() { $("#form").validate({ invalidHandler: addRules }); addRules(); $("#submit1").click(function(){ $(".group2").each(function(){ $(this).rules("remove"); }); }); $("#submit2").click(function(){ $(".group1").each(function(){ $(this).rules("remove"); }); }); }); var addRules = function(){ $("#input1").rules("add", {required:true}); $("#input2").rules("add", {required:true}); }
此方法允许您向作为validation组的每个输入添加类属性(group1或group2)。
您可以使用以下库,而不必编写特定于页面的代码来解决此问题:
https://github.com/bbraithwaite/JQueryValidationForWebForms
NB源代码如下,但Github链接始终具有最新源。
它位于jQuery Validation Framework之上,并通过使用类名作为约定来抽象出这个问题。
您以与jQueryvalidation相同的方式注册validation事件(仅使用不同的名称):
$(function() { $("#aspForm").validateWebForm(); });
示例.ASPX
具有两个validation组的基本.aspx示例可能如下所示。 你只需要包装每个逻辑部分并给它一个类名“form”,并在应该触发validation事件的动作上添加类“submit”:
源代码
(function ($) { $.extend($.fn, { validateWebForm: function (options) { var form = $(this[0]), formExists = (form.length) && form.is('form'); if (formExists) { if (!options) { options = {}; } // stop the validation from firing on the form submit options.onsubmit = false; // wire up the default jquery validation event to the form this.validate(options); // Select any input[type=text] elements within a validation group // and attach keydown handlers to all of them. $('.form :text').keydown(function (event) { // Only execute validation if the key pressed was enter. if (event.keyCode == 13) { $(event.currentTarget).closest(".form").find(".submit").click(); } }); // find the submit buttons and override the click event form.getSumbitControls().click(this.validateAndSubmit); return this; } return undefined; }, getSumbitControls: function () { return $(this).find('.form .submit'); }, getValidationContainer: function (submitControl) { return $(submitControl).closest('.form'); }, validateAndSubmit: function (event) { // Ascend from the button that triggered this click event // until we find a container element flagged with // .validationGroup and store a reference to that element. var group = $(this).getValidationContainer(event.currentTarget), isValid = true; // Descending from that .form element, find any input // elements within it, iterate over them, and run validation on // each of them. group.find(':input').each(function (i, item) { if (!$(item).valid()) { isValid = false; } }); // If any fields failed validation, prevent the button's click // event from triggering form submission. if (!isValid) { event.preventDefault(); } } }); })(jQuery);
Nuget用户
PM> Install-Package JQuery.Validation.WebForms
这是从Dave Ward的以下post中演变而来的:
http://encosia.com/asp-net-webforms-validation-groups-with-jquery-validation/
您总是可以使用一些简单的jquery / javascript来删除asp按钮OnClientClick上的“validate [required]”类,然后将其添加回其他按钮OnClientClick,这比更改validationengine文件或替换它们更容易。 一个例子是:
javascript将是:
function disableReg() { $('#<%=txtName.ClientID%>').removeClass("validate[required]"); $('#<%=txtEmail.ClientID%>').removeClass("validate[required]"); $('#<%=txtUser.ClientID%>').addClass("validate[required]"); $('#<%=txtPass.ClientID%>').addClass("validate[required]"); return true; } function disableLogin() { $('#<%=txtUser.ClientID%>').removeClass("validate[required]"); $('#<%=txtPass.ClientID%>').removeClass("validate[required]"); $('#<%=txtName.ClientID%>').addClass("validate[required]"); $('#<%=txtEmail.ClientID%>').addClass("validate[required]"); return true; }
跟踪validation对象并直接删除/替换规则。 适用于v1.13.0
var validation = $('#form1').validate(); //Keep track of validation object //Rule set 1 var validationRulesLogin = { headerEmail: { required: true, email: true }, headerPassword: "required" }; var validationMessagesLogin = { headerEmail: { required: "Please enter your email address.", email: "Not a valid email address." }, headerPassword: "Please enter your password." }; //Rule set 2 var validationRulesSignup = { signupEmail: { required: true, email: true }, signupPassword: "required", signupPassword2: { equalTo: "#phBody_txtNewPassword" } }; var validationMessagesSignup = { signupEmail: { required: "Please enter your email address.", email: "Not a valid email address." }, signupPassword: "Please enter your password.", signupPassword2: "Passwords are not the same." }; //Toggle rule sets on form focus, button click or other event. function validatingLoginForm(){ validation.resetForm(); validation.settings.rules = validationRulesLogin; validation.settings.messages = validationMessagesLogin; } function validationSignupForm(){ validation.resetForm(); validation.settings.rules = validationRulesSignup; validation.settings.messages = validationMessagesSignup; }
如果你使用不显眼的jqueryvalidation,或者你可以使用这个:
$(document).ready(function () { var formValidator = $("form").validate(); $("#btnLogin").click(function () { formValidator.settings.ignore = "#registerSection *"; }); $("#btnRegister").click(function () { formValidator.settings.ignore = "#loginSection *"; }); });
通过在表示服务器端validation控件的HTML元素上附加特殊的CSS类名,使ASP.NET服务器validation逻辑可用于客户端/ jQuery。
生成的CSS类名称将表示validation组。 因此,例如,某些文本框将使用一个validation组的类名称和其他validation组的其他文本框进行标记。
例如,在Page PreRender处理程序中编写和调用此C#函数,或者在呈现页面之前使用特殊的CSS灌注服务器控件。
/// /// Makes the server validation logic knowledge available to the client side /// by appending css class names to validators and html elements being validated. /// The generated css classes can be targeted by jQuery in the DOM. /// /// prefix string for validator css names /// prefix string for target element css names /// /// The css prefix arguments to this function help distinguish between what is a /// validation control and what is an html element being targeted by said validation control. /// /// void TagValidationWithCss(string cssPrefixValidator, string cssPrefixTarget) { List valClasses = new List (); List targetClasses = new List (); // iterate over validator server controls foreach (BaseValidator val in Page.Validators) { // keep a unique list of generated validator css class names string classnameVal = cssPrefixValidator + val.ValidationGroup; if (!valClasses.Contains(classnameVal)) valClasses.Add(classnameVal); // ..and mark the validator element with the generated css class name val.CssClass += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameVal; // keep a unique list of generated target element css class names string classnameTarg = cssPrefixTarget + val.ValidationGroup; if (!targetClasses.Contains(classnameTarg)) targetClasses.Add(classnameTarg); // ..and mark the target element with the generated css class name Control target = FindControl(val.ControlToValidate); if (target is HtmlControl) ((HtmlControl)target).Attributes["class"] += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameTarg; else if (target is WebControl) ((WebControl)target).CssClass += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameTarg; } // output client script having array of validator css names representing validation groups string jscriptVal = string.Format("", string.Join("','", valClasses.ToArray()), cssPrefixValidator); ClientScript.RegisterStartupScript(this.GetType(), "val", jscriptVal); //output client script having array of html element class names representing validation groups string jscriptTarg = string.Format("", string.Join("','", targetClasses.ToArray()), cssPrefixTarget); ClientScript.RegisterStartupScript(this.GetType(), "targ", jscriptTarg); }
该函数在服务器端页面中调用:
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); TagValidationWithCss("validator-", "target-"); }
ASPX页面的声明性语法可能有两个部分,如下所示:
Login Section
Registration Section
现在转到渲染页面以查看结果…..
页面HTML源包含表示validation组的生成的CSS名称数组,一组用于validation器(validation器),另一组用于validation目标(目标 – )
这些CSS名称也在html元素上呈现。 请注意此处文本框中的“target-vg1”CSS类,表示validation组#1。 文本框表示页面上的登录屏幕/界面(两个UI部分之一):
第二组文本框位于同一个ASP.NET页面上(在相同的ASP.NET窗体中),并表示用户注册屏幕/界面(第二个UI部分)。 请注意,这些文本框通过css类标记了名为“target-vg2”的不同validation组。
因此,我们将特殊的Css名称注入到ASP.NET流程中,而不会中断或破坏它。
最终,这个专门的输出允许你编写自定义脚本(即使用jQuery)来抓取那些特殊的CSS类名,并区分客户端的validation组。
这个简单的示例警告客户端validation组的名称,以certificate它们被看到和知道。 呼!
jQuery也可用于定位特殊的css类。
这并未涵盖所有情况。 这可能真的是午餐,但有趣的是。 服务器端和客户端代码需要调整为个人或项目品味。
(您还希望依赖于这样一个事实:较新的浏览器可以使用’class’属性将多个CSS类应用于一个元素,方法是使用空格分隔类名,例如 – class =“vg1 animated bright myclass your class”。这允许生成的css要在现有类名后面附加的类名而不覆盖它们。)