IE 中的 jQuery.validate 错误

发布于 2024-11-07 21:14:53 字数 2901 浏览 0 评论 0原文

我有一个 MVC 应用程序,我添加了自定义跨字段验证。跨字段验证未配置为客户端,但是当我通过字段进行 Tab 浏览时,IE 会从 jquery.validate 中抛出以下错误“$.validator.method[...] 为 null 或不是对象” .js。我已经附加了完整版本,这样我就可以调试正在发生的事情,它似乎试图在客户端下面触发我的“mandatoryif”自定义验证,然后在以下行抛出错误:

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

任何想法为什么它试图当客户端未添加“mandatoryif”验证时执行此操作吗?

我还更新到了最新版本,因为我读到它可能是 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 };
    }

感谢对此的任何帮助。

I have an MVC application which I have added custom cross-field validation. The cross-field validation isn't configured to be client-side however when I tab through my fields IE is throwing the following error "$.validator.method[...] is null or not an object" from within jquery.validate.js. I have attached the full version so I can debug what's going on and it seems to be trying to fire my "mandatoryif" custom validation below on the client-side and then throwing the error at the following line:

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

Any ideas why it is trying to do this when the "mandatoryif" validation hasn't been added client-side?

I have also updated to the latest version as I read it could be the version of jQuery.validate but this didn't fix the issue either.

Here is my custom validation:
Attribute

[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;
    }

Validator

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 };
    }

Appreciate any help on this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迎风吟唱 2024-11-14 21:14:53

我已经设法找到我的查询的答案。因为我的一些自定义验证是对数据库进行查找,所以我不希望在客户端完成此操作的开销,因此没有客户端代码。但是,我没有意识到通过添加

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

在 Global.asax 中,添加此客户端会产生影响。当然,因为没有代码来处理客户端,所以会抛出验证错误。

I have managed to find the answer to my query. Because some of my custom validation was doing lookups to the db I didn't want the overhead of this being done client-side so there was no client-side code. However, I didn't realise that by adding

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

in Global.asax that it was in affect adding this client-side. Of course because there was no code to process client-side it was throwing the validaiton error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文