Ошибка jQuery.validate в IE - PullRequest
       27

Ошибка jQuery.validate в IE

0 голосов
/ 19 мая 2011

У меня есть приложение MVC, в которое я добавил настраиваемую проверку кросс-полей.Проверка перекрестного поля не настроена на стороне клиента, однако, когда я перемещаюсь по полям, IE выдает следующую ошибку «$ .validator.method [...] является нулевым или не является объектом» из jquery.validate.js.Я приложил полную версию, чтобы я мог отладить происходящее, и он пытается запустить мою «обязательную» пользовательскую проверку ниже на стороне клиента, а затем выдает ошибку в следующей строке:

var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );  

Есть идеи, почему он пытается это сделать, если проверка "обязательной" не была добавлена ​​на стороне клиента?

Я также обновился до последней версии, поскольку я читал, что это может быть версия jQuery..validate, но это также не решило проблему.

Вот мое пользовательское подтверждение: Атрибут

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class MandatoryIfAttribute : ValidationAttribute, ICrossFieldValidationAttribute
{       
    public string OtherProperty { get; set; }

    public bool IsValid(ControllerContext controllerContext, object model, ModelMetadata modelMetadata)
    {
        if (model == null)
        {
            throw new ArgumentNullException("model");
        }

        // Find the value of the other property.
        var propertyInfo = model.GetType().GetProperty(OtherProperty);
        if (propertyInfo == null)
        {
            throw new InvalidOperationException(string.Format("Couldn't find {0} property on {1}.",
                                                              OtherProperty, model));
        }

        var otherValue = propertyInfo.GetGetMethod().Invoke(model, null);

        if (modelMetadata.Model == null)
        {
            modelMetadata.Model = string.Empty;
        }

        if (otherValue == null)
        {
            otherValue = string.Empty;
        }

        return (String.IsNullOrEmpty(modelMetadata.Model.ToString()) && (String.IsNullOrEmpty(otherValue.ToString()) || otherValue.ToString() == "0")) || (!String.IsNullOrEmpty(modelMetadata.Model.ToString()) && String.IsNullOrEmpty(otherValue.ToString())) || (!String.IsNullOrEmpty(modelMetadata.Model.ToString()) && !String.IsNullOrEmpty(otherValue.ToString()));
    }

    public override bool IsValid(object value)
    {
        // Work done in other IsValid
        return true;
    }

Валидатор

public class MandatoryIfValidator : CrossFieldValidator<MandatoryIfAttribute>
{       
    public MandatoryIfValidator(ModelMetadata metadata, ControllerContext controllerContext,
                                    MandatoryIfAttribute attribute) :
        base(metadata, controllerContext, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "mandatoryif",
            ErrorMessage = Attribute.FormatErrorMessage(Metadata.PropertyName),
        };

        rule.ValidationParameters.Add("otherProperty", Attribute.OtherProperty);

        return new[] { rule };
    }

Ценю любую помощь по этому вопросу.

1 Ответ

1 голос
/ 26 мая 2011

Мне удалось найти ответ на мой запрос.Поскольку некоторые из моих пользовательских проверок выполняли поиск в БД, я не хотел, чтобы накладные расходы выполнялись на стороне клиента, поэтому на стороне клиента не было кода.Однако, я не осознавал, что, добавив

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MandatoryIfAttribute), typeof(MandatoryIfValidator));

в Global.asax, это повлияет на добавление этой клиентской стороны.Конечно, поскольку не было кода для обработки на стороне клиента, он выдавал ошибку проверки.

...