2011-08-23 53 views
4

我有一個項目,我有一個數據庫模型類與一個單獨的EDMX EF模型一起提供。在相同的解決方案中,我有一個Web服務,它與模型類一起訪問此項目。我希望模型類對前端執行數據註釋以進行驗證,但是根本沒有得到驗證。DataAnnotations EntityFramework(數據庫優先)方法

爲簡潔起見,模型類(在我的Model項目中)如下所示。我的Web服務引用這個類並用作接口。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

[DataContract] 
[MetadataType(typeof(CustomerMetaData))] 
public partial class Customer 
{ 
} 

public class CustomerMetaData 
{ 
    [DataMember] 
    public object CustomerID { get; set; } 

    [Required] 
    [StringLength(50)] 
    [DataType(DataType.EmailAddress)] 
    [DataMember] 
    public object Email { get; set; } 
} 

當我點擊窗體上的提交按鈕時,它會嘗試添加記錄並且不執行任何驗證。發生運行時錯誤,通知我該電子郵件地址是必需的。我顯然希望這個驗證可以在數據註釋之前完成。

我該如何做到這一點?

實際運行時錯誤回來說,當試圖添加記錄時,電子郵件地址不應該爲NULL。這是對的。數據庫列需要一個值。

我認爲通過在模型中使用數據註釋,如果前端出現問題,並且一旦表單試圖發佈,模型就無效,則相應的數據註釋錯誤應顯示在表單上。我的印象是,沒有必要編寫任何特定的客戶端驗證。該模型應該爲你照顧。這個假設我錯了嗎?

有網絡如何與CodeFirst做到這一點的文章,但我已經看到了如何與DataBaseFirst做到這一點沒有。這如何實現?

再次,我的客戶類如下。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

namespace YeagerTechModel 
{ 
    [Serializable] 
    [DataContract] 
    //[MetadataType(typeof(CustomerMetaData))] 
    public partial class Customer 
    { 
     public Customer() 
     { 
      this.Projects = new HashSet<Project>(); 
     } 

     [DataMember] 
     public short CustomerID { get; set; } 

     [Required] 
     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     [DataMember] 
     public string Email { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Company { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string FirstName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string LastName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Address1 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Address2 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string City { get; set; } 

     [StringLength(2)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string State { get; set; } 

     [StringLength(10)] 
     [DataType(DataType.Text)] 
     [RegularExpression(@"^\d{5}(-\d{4})?$")] 
     [DataMember] 
     public string Zip { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     [DataMember] 
     public string HomePhone { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     [DataMember] 
     public string CellPhone { get; set; } 

     [StringLength(100)] 
     [DataType(DataType.Url)] 
     [DataMember] 
     public string Website { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     [DataMember] 
     public string IMAddress { get; set; } 

     [DataMember] 
     public System.DateTime CreatedDate { get; set; } 

     [DataMember] 
     public Nullable<System.DateTime> UpdatedDate { get; set; } 

     public virtual ICollection<Project> Projects { get; set; } 
    } 
} 

當我在客戶端調試「if(ModelState.IsValid)」時,該屬性總是返回true。就好像DataAnnotations甚至沒有被識別。在調試時,我檢查了ModelState對象,它有所有的屬性值(在所有情況下都是空字符串,因爲我試圖強制一個錯誤)。我應該在電子郵件地址上收到一個isRequired錯誤,我故意留空。

[HttpPost] 
     public ActionResult Create(YeagerTechWcfService.Customer cust) 
     { 
      if (ModelState.IsValid) 
      { 
       try 
       { 
        db.AddCustomer(cust); 
        TempData["ErrCode"] = "Customer successfully added."; 
        return RedirectToAction("Index", "Home"); 
       } 
       catch (Exception ex) 
       { 
        ViewData["ErrCode"] = "CustErr"; 
        ViewBag.Error = ex.Message; 
        return View(); 
       } 
      } 
      else 
       return View(); 
     } 
+0

你在用什麼界面? Silverlight的? WPF? –

+0

ASP.Net with MVC 3 – sagesky36

+0

您是否在使用'ModelState.IsValid'提交模型時檢查模型的狀態? –

回答

1

不幸的是,這個註釋只會影響渲染,而不會影響驗證。我剛剛和DataType.Url有同樣的問題,並且在Is the DataTypeAttribute validation working in MVC2?(儘管對於MVC 2--但問題在3中似乎相同)中也討論了它。

剛落上有一個正則表達式數據註釋:

[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Email was invalid.")] 
0

只是爲了擴大這個有點,在MVC 3,你可以走另一條路線使用驗證。我第一次使用MVC 3 + EF數據庫,我可以在擴展/部分型號課堂上使用這樣的代碼:

[MetadataType(typeof(Foobar.Metadata))] 
[Serializable] 
public partial class Foobar 
{ 
    private sealed class Metadata 
    { 
     [Required] 
     [MinLength(10)] 
     public object Name { get; set; } 
    } 

    // Other stuff here 
} 

後來,當我可以在控制器的動作餵我的小Foobar的一個無效的名字,我可以得到通過使用TryValidateModel而不是ModelState.IsValid(驗證錯誤恐怖,我不綁定數據)。

 Foobar c = new Foobar(); 
     c.Name = "ponies"; 

     var y = TryValidateModel(c); 
     if (!y) 
     { 
      foreach (var item in ModelState.Values) 
      { 
       foreach (var err in item.Errors) 
       { 
        DoxLog.Error(err.ErrorMessage, err.Exception); 
       } 
      } 
     } 
相關問題