Member 14908411 Ответов: 0

Обязательным настраиваемого атрибута проверки на стороне клиента не стреляли


Я хотел поставить атрибут обязательным, на мою собственность. Итак, я получил одно решение из интернета.

моя модель
  [RequiredIf("IsSellable","false",
              ErrorMessageResourceName="Offer Code is required", 
              ErrorMessageResourceType = typeof(ResourceString))]
public string Code { get; set; }
public bool IsSellable { get; set; }


И я создал пользовательский атрибут для обязательным
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable
   {
       private String PropertyName { get; set; }
       private Object DesiredValue { get; set; }
       private readonly RequiredAttribute _innerAttribute;

       public RequiredIfAttribute(String propertyName, Object desiredvalue)
       {
           PropertyName = propertyName;
           DesiredValue = desiredvalue;
           _innerAttribute = new RequiredAttribute();
       }

       protected override ValidationResult IsValid(object value, ValidationContext context)
       {
           var dependentValue = context.ObjectInstance.GetType().GetProperty(PropertyName).GetValue(context.ObjectInstance, null);

           if (dependentValue.ToString() == DesiredValue.ToString())
           {
               if (!_innerAttribute.IsValid(value))
               {
                   return new ValidationResult(FormatErrorMessage(context.DisplayName), new[] { context.MemberName });
               }
           }
           return ValidationResult.Success;
       }

       public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
       {
           var rule = new ModelClientValidationRule
           {
               ErrorMessage = ErrorMessageString,
               ValidationType = "requiredif",
           };
           rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(PropertyName);
           rule.ValidationParameters["desiredvalue"] = DesiredValue is bool ? DesiredValue.ToString().ToLower() : DesiredValue;

           yield return rule;
       }
   }

А для клиентской стороны я добавил Такой метод как
  $(function () {
$.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'desiredvalue'], function (options) {
    options.rules['requiredif'] = options.params;
    options.messages['requiredif'] = options.message;
});

$.validator.addMethod('requiredif', function (value, element, parameters) {
    var desiredvalue = parameters.desiredvalue;
    desiredvalue = (desiredvalue == null ? '' : desiredvalue).toString();
    var controlType = $("input[id$='" + parameters.dependentproperty + "']").attr("type");
    var actualvalue = {}
    if (controlType == "checkbox" || controlType == "radio") {
        var control = $("input[id$='" + parameters.dependentproperty + "']:checked");
        actualvalue = control.val();
    } else {
        actualvalue = $("#" + parameters.dependentproperty).val();
    }
    if ($.trim(desiredvalue).toLowerCase() === $.trim(actualvalue).toLocaleLowerCase()) {
        var isValid = $.validator.methods.required.call(this, value, element, parameters);
        return isValid;
    }
    return true;
}); });

Все еще моя клиентская валидация не срабатывает для свойства кода. Для других свойств формы проверка на стороне клиента работает нормально.

Что я уже пробовал:

Я попытался зарегистрировать адаптер в global.asax, метод Application_start
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),
                                                      typeof(RequiredAttributeAdapter));

Richard Deeming

Репост:
Вы уже опубликовали этот вопрос:
Expressiveannotations проверка на стороне клиента не срабатывает[^]

0 Ответов