使用IValidatableObject验证mvc 3中的上传图像

时间:2011-02-11 15:30:39

标签: c# asp.net-mvc

我在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方法,但我没有看到让它工作的方法。

1 个答案:

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