MVC3 Validation - Require One From Group

后端 未结 4 2215
梦毁少年i
梦毁少年i 2020-11-29 19:28

Given the following viewmodel:

public class SomeViewModel
{
  public bool IsA { get; set; }
  public bool IsB { get; set; }
  public bool IsC { get; set; } 
         


        
4条回答
  •  情话喂你
    2020-11-29 19:56

    I implemented Darin's awesome answer into my application, except I added it for strings and not boolean values. This was for stuff like name/company, or phone/email. I loved it except for one minor nitpick.

    I tried to submit my form without a work phone, mobile phone, home phone, or email. I got four separate validation errors client side. This is fine by me because it lets the users know exactly what field(s) can be filled in to make the error go away.

    I typed in an email address. Now the single validation under email went away, but the three remained under the phone numbers. These are also no longer errors anymore.

    So, I reassigned the jQuery method that checks validation to account for this. Code below. Hope it helps someone.

    jQuery.validator.prototype.check = function (element) {
    
       var elements = [];
       elements.push(element);
       var names;
    
       while (elements.length > 0) {
          element = elements.pop();
          element = this.validationTargetFor(this.clean(element));
    
          var rules = $(element).rules();
    
          if ((rules.group) && (rules.group.propertynames) && (!names)) {
             names = rules.group.propertynames.split(",");
             names.splice($.inArray(element.name, names), 1);
    
             var name;
             while (name = names.pop()) {
                elements.push($("#" + name));
             }
          }
    
          var dependencyMismatch = false;
          var val = this.elementValue(element);
          var result;
    
          for (var method in rules) {
             var rule = { method: method, parameters: rules[method] };
             try {
    
                result = $.validator.methods[method].call(this, val, element, rule.parameters);
    
                // if a method indicates that the field is optional and therefore valid,
                // don't mark it as valid when there are no other rules
                if (result === "dependency-mismatch") {
                   dependencyMismatch = true;
                   continue;
                }
                dependencyMismatch = false;
    
                if (result === "pending") {
                   this.toHide = this.toHide.not(this.errorsFor(element));
                   return;
                }
    
                if (!result) {
                   this.formatAndAdd(element, rule);
                   return false;
                }
             } catch (e) {
                if (this.settings.debug && window.console) {
                   console.log("Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e);
                }
                throw e;
             }
          }
          if (dependencyMismatch) {
             return;
          }
          if (this.objectLength(rules)) {
             this.successList.push(element);
          }
       }
    
       return true;
    };
    

提交回复
热议问题