我在asp.net MVC 3中使用新的IValidatabeObject接口验证上传的图像时遇到了一些麻烦。
我需要做两件事:
我认为我可以使用验证块中的try / catch来完成此任务:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
try
{
System.Drawing.Image img = System.Drawing.Image.FromStream(this.ImageFile.InputStream);
if (img.Width != 200)
yield return new ValidationResult("This picture isn't the right size!!!!");
}
catch (Exception ex)
{
yield return new ValidationResult("This isn't a real image!") ;
}
}
当然,在现实生产应用程序中,我会在此前面进行一些轻量级验证,以检查文件扩展名以确保它是一个.jpg,以便在不调用昂贵的try / catch机制的情况下找到简单的问题。但最终我需要确定它是一个好的图像,所以我需要确保Image.FromStream将成功解析它。
编译器不喜欢这种方法,并告诉我不能从try / catch块返回。如果我省去yield return并直接返回IEnumerable,我会得到另一个编译器错误:
catch (Exception ex)
{
return new ValidationResult[] {new ValidationResult("This isn't a real image!") };
}
这会产生新的错误:“无法从迭代器返回值。使用yield return语句...”
我喜欢将验证逻辑作为模型的一部分,所以我不想放弃IValidatableObject方法,但我没有看到让它工作的方法。
答案 0 :(得分:1)
将结果移到try catch块之外
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
ValidationResult result = null;
try
{
var img = System.Drawing.Image.FromStream(this.ImageFile.InputStream);
if (img.Width != 200)
result = new ValidationResult("This picture isn't the right size!!!!");
}
catch (Exception ex)
{
result = new ValidationResult("This isn't a real image!") ;
}
if (result != null)
yield return result;
}