1

私はmvcアプリケーションで控えめな検証を使用したいと思います。 私はクラスMVC非妥当性確認

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] 

公共密封されたクラスRequiredIfAttribute作成しました:ValidationAttribute、IClientValidatable { 民間のconst文字列_defaultErrorMessage = "{0}が必要です"。

private string _targetPropertyName; 
private bool _targetPropertyCondition; 

public RequiredIfAttribute(string targetPropertyName, bool targetPropertyCondition) 
    : base(_defaultErrorMessage) 
{ 
    this._targetPropertyName = targetPropertyName; 
    this._targetPropertyCondition = targetPropertyCondition; 
} 

public override string FormatErrorMessage(string name) 
{ 
    return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, name, _targetPropertyName, _targetPropertyCondition); 
} 

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    bool result = false; 
    bool propertyRequired = false; 
    var targetProperty = validationContext.ObjectType.GetProperty(_targetPropertyName); 

    var targetPropertyValue = (bool)targetProperty.GetValue(validationContext.ObjectInstance, null); 

    if (targetPropertyValue == _targetPropertyCondition) 
    { 
     propertyRequired = true; 
    } 

    if (propertyRequired) 
    { 
     if (value == null) 
     { 
      var message = FormatErrorMessage(validationContext.DisplayName); 

      return new ValidationResult(message); 
     } 
    } 

    return null; 
} 

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
{ 
    var rule = new ModelClientValidationRule(); 

    rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
    rule.ValidationType = "requiredif"; 
    rule.ValidationParameters.Add("targetpropertyname", this._targetPropertyName); 
    rule.ValidationParameters.Add("targetpropertyvalue", this._targetPropertyCondition.ToString().ToLower()); 

    yield return rule; 
} 

}

Iクライアント

$(function() { 
$.validator.addMethod("requiredif", function (value, element, param) { 

    if ($(param.propertyname).is(':checked').toString() == param.propertyvalue) { 
     if (!this.depend(param, element)) 
      return "dependency-mismatch"; 
     switch (element.nodeName.toLowerCase()) { 
      case 'select': 
       var val = $(element).val(); 
       return val && val.length > 0; 
      case 'input': 
       if (this.checkable(element)) 
        return this.getLength(value, element) > 0; 
      default: 
       return $.trim(value).length > 0; 
     } 
    } 

    return true; 
}); 


$.validator.unobtrusive.adapters.add("requiredif", ["targetpropertyname", "targetpropertyvalue"], function (options) { 
    if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { 
     options.rules["requiredif"] = { 
      propertyname: "#" + options.params.targetpropertyname, 
      propertyvalue: options.params.targetpropertyvalue 
     }; 
     options.messages["requiredif"] = options.message; 
    } 
}); 

}(jQueryの)の検証機能を持っています)。

でも、それは検証されません。どうして?ありがとう

答えて

0

あなたがそこにいる場合は、web.configを確認してください。もちろん、この

<appSettings> 
<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

ようにあなたは、モデル

+0

おかげで、適切な属性を使用する必要があります!そのこと! –