【发布时间】:2011-02-11 15:30:38
【问题描述】:
我在使用 asp.net MVC 3 中的新 IValidatabeObject 接口验证上传的图像时遇到了一些问题。
我需要做两件事:
- 确保上传的字节确实是图片
- 确保此图片的宽度为 200 像素
我认为我可以在验证块中使用 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 方法,但我看不到让它工作的方法。
【问题讨论】:
标签: c# asp.net-mvc