2

我可以發誓,這應該已經回答了一百萬次之前,但我搜索了一段時間後空了。圖片上傳,驗證EF代碼優先模型

我有一個視圖綁定到一個對象。這個對象應該有一個附加到它的圖像(我沒有任何首選的方法)。我想驗證圖像文件。我見過的方式與屬性要做到這一點,例如:

public class ValidateFileAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 

     if (file.ContentLength > 1 * 1024 * 1024) 
     { 
      return false; 
     } 

     try 
     { 
      using (var img = Image.FromStream(file.InputStream)) 
      { 
       return img.RawFormat.Equals(ImageFormat.Png); 
      } 
     } 
     catch { } 
     return false; 
    } 
} 

然而,這需要HttpPostedFileBase對房地產模型類型:

public class MyViewModel 
{ 
    [ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")] 
    public HttpPostedFileBase File { get; set; } 
} 

這一切都很好,但我不能在EF Code First模型類中使用這種類型,因爲它不適合數據庫存儲。

那麼最好的方法是什麼?

+1

是的,這是有一個My ** ViewModel **的整個點。你在你的視圖中使用你的ViewModels。而且你爲你的實體創建了不同的類型,並且你手動或者像Automapper這樣做了它們之間的映射。 – nemesv

+0

我以前沒有聽說過(我只是MVC開發的幾天)。我實際上想到了另一個解決方案,爲我工作。我把它貼在 – Inrego

+0

以下但是對於所有模型來說,ViewModels並不是很多額外的工作嗎?這難道不是幹掉乾的做事方式的目的嗎? – Inrego

回答

-1

當我遠一點與網站的發展,這是不可避免的,我開始使用的ViewModels。爲每個視圖創建一個模型肯定是要走的路。

2

原來這是一個相當簡單的解決方案。

public class MyViewModel 
{ 
    [NotMapped, ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")] 
    public HttpPostedFileBase File { get; set; } 
} 

我設置了NotMapped屬性標記,以防止它被保存在數據庫中。然後在我的控制,我得到的HttpPostedFileBase在我的對象模型:

public ActionResult Create(Product product) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(product); 
     } 
     // Save the file on filesystem and set the filepath in the object to be saved in the DB. 
    }