【问题标题】:Validating uploaded images in mvc 3 with IValidatableObject使用 IValidatableObject 在 mvc 3 中验证上传的图像
【发布时间】: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


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多