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