2011-08-23 55 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); 
       } 
      } 
     } 
相关问题