![](/img/trans.png)
[英]Model validation in ASP.NET MVC using Attributes or using IValidatableObject(sel-validating model)
[英]Validating uploaded images in mvc 3 with IValidatableObject
我在使用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方法,但是我沒有找到一種使之可行的方法。
將結果移到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.