Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 上载前图像宽度/高度的客户端验证,ASP.NET MVC5_Jquery_Asp.net Mvc_Unobtrusive Validation - Fatal编程技术网

Jquery 上载前图像宽度/高度的客户端验证,ASP.NET MVC5

Jquery 上载前图像宽度/高度的客户端验证,ASP.NET MVC5,jquery,asp.net-mvc,unobtrusive-validation,Jquery,Asp.net Mvc,Unobtrusive Validation,我试图在上传之前验证图像的宽度和高度。 我创建了一个验证属性,服务器端工作正常,但无法修复客户端验证 这是自定义验证属性 public class ImageDimensionsAttribute : ValidationAttribute, IClientValidatable { private readonly int _width; private readonly int _height; private readonly str

我试图在上传之前验证图像的宽度和高度。 我创建了一个验证属性,服务器端工作正常,但无法修复客户端验证

这是自定义验证属性

public class ImageDimensionsAttribute : ValidationAttribute, IClientValidatable
    {
        private readonly int _width;
        private readonly int _height;
        private readonly string _dims;

        public ImageDimensionsAttribute(int width, int height)
        {
            _width = width;
            _height = height;
            _dims = String.Format("{0},{1}", _width, _height);
        }

        public override bool IsValid(object value)
        {
            if (value == null) return true;
            var file = value as HttpPostedFileBase;

            using (var img = Image.FromStream(file.InputStream))
            {
                return img.Width <= _width && img.Height <= _height;
            }
        }

        public override string FormatErrorMessage(string name)
        {
            return string.Format(Messages.InvalidImageDimensions, _width, _height);
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
                ValidationType = "imagedimensions"
            };
            rule.ValidationParameters.Add("dims", _dims);
            yield return rule;
        }
    }

似乎javascript函数不会等到执行了
reader.onload
之后才执行,所以它总是返回false-所有内容都无效。我正在寻找一种让javascript“等待”的方法。

检查我的答案,希望它会help@shafiq好主意+1检查我的答案,希望会help@shafiq好主意+1检查我的答案,希望会help@shafiq好主意+1
$(function () {
        $.validator.addMethod("imagedimensions", function (value, element, params) {
            if (value == null)
                return true;

            var file = element.files[0];           
            var reader = new FileReader();
            var image = new Image();
            var sizes = params.split(",");
            var maxWidth = parseInt(sizes[0]);
            var maxHeight = parseInt(sizes[1]);

            var result = false;
            reader.readAsDataURL(file);
            reader.onload = function (_file) {
                image.src = _file.target.result;                
                image.onload = function () {
                    var w = this.width,
                        h = this.height
                    console.log(w, h);
                    if (w > maxWidth || h > maxHeight) {
                        return false;
                    } else {                        
                        console.log("i am valid size but validator can not await");
                        return true;
                    }
                };                
            };
        });        

        $.validator.unobtrusive.adapters.addSingleVal("imagedimensions", "dims");
    }(jQuery));