2012-10-05 31 views
1

我使用的是帶有asp.net mvc3的ADO.Net實體框架。我有一個首先是數據庫的模型。正如我將解釋的,數據驗證在某些情況下不起作用。使用實體框架進行數據驗證

我有一個表格,當我提交該表格時,有些項目正在驗證,而另一些項目未被驗證。我只是用一種形式是這樣,

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 


    <fieldset> 
     <legend></legend> 


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

     <div class="editor-field"> 
      @Html.LabelFor(model => model.ENTITY2.Name) 
      @Html.EditorFor(model => model.ENTITY2.Name) 
      @Html.ValidationMessageFor(model => model.ENTITY2.Name) 
     </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 

現在,VERSION_ID具有驗證工作時的名稱不。我從另一個實體獲取名稱。關於爲什麼驗證不起作用的任何想法?我可以輸入空字段,這是不允許的,因爲該字段是必需的,但是當我按提交時,我得到一個錯誤。

+0

我只是將該字段設置爲必填。當我運行該程序並提交時,出現錯誤,告訴我無法將該值設置爲空。數據庫第一個模型爲我設置了所有的驗證。 – deep

回答

3

我認爲你的模型類允許空值。

我會避免直接在視圖中使用Model類併爲此創建單獨的ViewModel(POCO類)。 ViewModel應該只有視圖需要的相關屬性。不是大部分時間域模型的所有屬性!您可以在視圖模型使用數據的註釋(必需屬性等等...)

public class VersionViewModel 
{ 
    [Required] 
    public string VersionID { set;get;} 

    [Required] 
    public string Name { set;get;} 
} 

你的觀點會被強類型到這個視圖模型。當發佈回操作方法時,您將映射來自您的域模型的ViewModel的值並保存。

[HttpPost] 
public ActionResult Edit(VersionViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
    //validation is ok. Let's save 
    var domainModel=new Version(); 
    domainModel.VERSION_ID=model.VersionID ; 
    domainModel.Name=model.Name; 

    //Let's save and REdirect 
    yourRepositary.SaveVersion(domainModel); 
    return RedirectToAction("Saved",new { id=model.ID});  
    } 
    return View(model); 
} 

不用手動映射,您可以考慮使用的庫,例如AutoMapper

+0

我認爲這將在我創建的實體之上工作? – deep

+0

您的ViewModel與您的實體不同.VM具體用於將數據從視圖傳輸到動作方法並返回。 – Shyju

+1

非常感謝!生病肯定會給這個嘗試。 – deep