簡體   English   中英

使用IValidatableObject在MVC 3中驗證上傳的圖像

[英]Validating uploaded images in mvc 3 with IValidatableObject

我在使用asp.net MVC 3中的新IValidatabeObject接口驗證上傳的圖像時遇到了一些麻煩。

我需要做兩件事:

  • 確保上傳的字節確實是圖像
  • 確保此圖片的寬度為200px

我以為可以在驗證塊中使用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方法,但是我沒有找到一種使之可行的方法。

將結果移到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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM