Обязательным настраиваемого атрибута проверки на стороне клиента не стреляли
Я хотел поставить атрибут обязательным, на мою собственность. Итак, я получил одно решение из интернета.
моя модель
[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 проверка на стороне клиента не срабатывает[^]