jQuery disable rule validation on a single field

ValidationJquery Validate

Validation Problem Overview


I am using MVC to create forms that are generated at runtime. For validation, I am trying my hand at the jQuery validation library which is very convenient to use. I have the validation expression of each field in the cdata attribute of the tag

<input type="text" name="xyz" id="xyz" class="defaultTextBox"
  cdata="{validate:{required:true, decimal:true, messages:
          {required:'Please enter an decimal value', 
           decimal:'Please enter a valid decimal'}}}">

This works beautifully. Now one more requirement I have is that some fields are being shown and hidden according to the logic on the page and I need to disable the validation on the hidden fields such that they do not interfere with the form submission. Just toggling the required:true to false and back to true should be enough. Only i do not know how.

Anyone has any experience with that?

Validation Solutions


Solution 1 - Validation

Just add the ignore rule and define the selector. In this example, the validation will ignore all elements that have the class="ignore"

$("#myform").validate({
   ignore: ".ignore"
})

Solution 2 - Validation

If you're using ASP.NET MVC Unobtrusive JQuery validation you need to set the settings in this way. This is because of the way Microsoft actually calls jQuery validate. This should be safe to do inside a ready method.

Edit: Please see Cory's comment below before copy pasting this. This is my original code

    $("form").data("validator").settings.ignore = ".data-val-ignore, :hidden, :disabled";

Then I just apply .data-val-ignore class to things not to validate.

Note that you'll probably want to add :hidden which is actually the default ignore behavior defined in jquery.validate.js. I like to add :disabled too.

$.extend($.validator, {
defaults: {
	messages: {},
	groups: {},
	rules: {},
	errorClass: "error",
	validClass: "valid",
	errorElement: "label",
	focusInvalid: true,
	errorContainer: $([]),
	errorLabelContainer: $([]),
	onsubmit: true,
	ignore: ":hidden",              // default for ignore in jquery.validate.js
	ignoreTitle: false,
	onfocusin: function( element, event ) {
		this.lastActive = element;

And finally you may want to style it - especially useful during debugging.

.data-val-ignore
{
    background: #eee;
}

Solution 3 - Validation

Following on Gabe's answer, you can also set the ignore value as a default, so you don't have to set it on each form.

$.validator.setDefaults({ignore: ".ignore"});

Also note, the ignore field is a jQuery selector that is used in the jQuery not() function so any valid selector can be used, not just simple classes.

See also http://docs.jquery.com/Plugins/Validation/validate#toptions for details on other default values that can be set.

Solution 4 - Validation

I had a better time with $('.multiselect').rules('remove');

in my case for whatever reason adding .cancel or .data-val-ignore to both the $.validator.setDefaults and $('.multiselect') did not fix it.

I also tried

$('select[multiple][data-val]').removeAttr('data-val').removeAttr('data-val-number').addClass('data-val-ignore').validate({ ignore: "[multiple]" });
$.validator.setDefaults({ ignore: ":hidden,:disabled,.data-val-ignore" });
$('.multiselect').closest('form').data('validator').settings.ignore = ":hidden,:disabled,.data-val-ignore, .data-val-ignore *";
$('.multiselect').data('validator').settings.ignore = "[multiselect]"

each of those... and combinations of them

my jquery.validate.js was

/*! jQuery Validation Plugin - v1.11.0 - 2/4/2013
* https://github.com/jzaefferer/jquery-validation
* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */

jquery was

jQuery JavaScript Library v1.9.1 - Date: 2013-2-4

Solution 5 - Validation

You can remove a rule from a single field by doing the following:

 $("#field").rules('remove', 'required');

Where the second parameter is the rule name. I also remove the attribute associated with this rule to avoid any confusion:

 $("#field").removeAttr('required');     



                           

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionshakeView Question on Stackoverflow
Solution 1 - ValidationGabeView Answer on Stackoverflow
Solution 2 - ValidationSimon_WeaverView Answer on Stackoverflow
Solution 3 - ValidationNorman HView Answer on Stackoverflow
Solution 4 - ValidationMaslowView Answer on Stackoverflow
Solution 5 - Validationcombatc2View Answer on Stackoverflow