MVC 4使用数据注释进行手动验证

时间:2013-04-05 12:26:43

标签: entity-framework asp.net-mvc-4 data-annotations

我承认我发现了许多类似的问题但不完全是这个:) 我有具有数据注释属性的实体:

  public class BaseEntity
  {
    [Required, DataType(DataType.DateTime)]
    public DateTime CreatedAt { get; set; }
    public string CreatedBy { get; set; }
  }
  public class ExchangeRights : BaseEntity
  {
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required, DataType(DataType.EmailAddress)]
    public string Email { get; set; }
  }

我尝试验证一个空对象:

  ExchangeRights r = new ExchangeRights();
  ValidationContext vCtx = new ValidationContext(r);
  List<ValidationResult> res = new List<ValidationResult>();
  Validator.TryValidateObject(r, vCtx, res, true);

这只是一个错误的结果。电子邮件字段是必需的。但是没有表明没有电子邮件格式,也没有表明没有设置CreatedAt字段(好吧也许是因为不可为空的值类型)
但这是扭曲。
首先,我真的希望每个错误都应该表明它是空的,而不是电子邮件格式 但更大的问题是,如果我将电子邮件设置为“asd”,则该方法不会返回错误 但是如果我在创建页面上使用强类型视图(使用带有Razor的MVC4)的实体,一切正常,那就很奇怪了。
表格表明电子邮件是需要的,或者我设置的电子邮件是否表示无效的电子邮件地址格式。 还表示CreatedAt字段是必需的(有或没有Required属性!! ),如果我设置它,则表示无效的日期时间格式。

任何帮助/想法/预感都将受到赞赏。

谢谢,
彼得

2 个答案:

答案 0 :(得分:1)

要验证电子邮件,您应使用EmailAddress验证属性。 [EmailAddress]

对于CreatedAt,由于DateTime是非可空类型,因此在创建ExchangeRights实例时,将使用DateTime.MinValue填充属性CreatedAt。所以该物业有价值。如果您想要一个不同的行为,请使用DateTime?而不是DateTime。

希望这有帮助。

答案 1 :(得分:1)

您可以使用DataTypeAttribute属性,原因如下:为数据字段提供其他类型信息,将自定义字段模板与数据字段相关联。 DataTypeAttribute不用于验证,它可用于提供一些额外的元数据信息。要验证电子邮件,您可以使用DataAnnotations Extensions EmailAttribute或编写自己的验证属性。

您可以在中找到更多信息 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatypeattribute.aspx