2013-06-21 48 views
0

嗨我有這個自定義驗證,但有一點差異待驗證的屬性的類型,並且總是即使我如果符合業務規則ModelState的值是「空」 = S ...這裏的一些代碼自定義HttpAttribute覆蓋時驗證IsValid(對象值)始終爲空

型號

[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "image")] 
     [ValidateFile(Allowed = new string[] { ".png", ".jpeg", ".jpg" }, 
         MaxLength = 1024 * 1024 * 3, 
         ErrorMessage = "Please select a PNG , JPEG , JPG image smaller than 3MB")] 
public byte[] Photo { get; set; } 

===========

ValidateFileAtribute

public class ValidateFileAttribute : RequiredAttribute 
{ 
    public int MaxLength { get; set; } 
    public string[] Allowed { get; set; } 

    public override bool IsValid(object **value**) 
    { 


     var Photo = value as HttpPostedFileBase; 
     if (Photo == null) 
     { 
      return false; 
     } 

     if (Photo.ContentLength > MaxLength) 
     { 
      return false; 
     } 

     if (!Allowed.Contains(Photo.FileName.Substring(Photo.FileName.LastIndexOf('.')))) 
     { 
      return false; 
     } 

     return true; 

    } 

這裏的價值不應該是空的!

Create.cshtml

@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 


    <fieldset> 
     <legend>Restaurant</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.City) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.City) 
      @Html.ValidationMessageFor(model => model.City) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Country) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Country) 
      @Html.ValidationMessageFor(model => model.Country) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model=>model.Photo) 
     </div> 
     <div class="editor-field"> 
     @Html.EditorFor(model=>model.Photo) 
     @Html.ValidationMessageFor(model => model.Photo) 
     <input name="ImageFile" type="file" id="ImageFile" /> 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 

    </fieldset> 
} 

任何幫助嗎?

回答

0

你的財產:

public byte[] Photo { get; set; } 

在屬性:

var Photo = value as HttpPostedFileBase; 

這將是始終爲空。嘗試:

var Photo = value as byte[] 

當然,您必須修復驗證邏輯的附加部分。

+0

感謝您的回答,我確實嘗試了您發佈的內容並修復了一些邏輯,但即使當我將var Photo = value更改爲[] –

+0

時,值仍然爲null然後,您不會爲Photo屬性分配任何內容。 –

0

我會檢查你在byte []照片中的位置,因爲我注意到當進入的數據無效時,'object value'爲空。

一個例子是,對於int的數據類型,當我輸入2147483647,「對象值」確實包含2147483647

當我輸入2147483648,該值參數包含0作爲最大的正整數值是2147483647。

更新13年7月5日

你需要改變你的數據類型爲 「HttpPostedFileBase」

public HttpPostedFileBase Photo {get;組; }

,而不是 「字節[]」

公共字節[] {照片獲得;組; }

不應該有任何需要

[System.ComponentModel.DataAnnotations.Schema。柱(類型名= 「圖像」)]

(對象**值**)

現在應該包含其中包含文件到System.Web.HttpPostedFileWrapper被上傳。

這與我之前寫的一致,如果進入的數據類型不正確,您將得到一個null

+0

對,如何使圖像我;試圖上傳將是有效的? –

+0

我更新了上面的答案。讓我知道,如果你得到它的工作。 – Remy