0

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

  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 属性!!) 如果我设置它,它会说无效的日期时间格式。

任何帮助/想法/预感将不胜感激。

谢谢,
彼得

4

2 回答 2

1

对于电子邮件的验证,您应该使用EmailAddress验证属性。[EmailAddress].

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

希望这可以帮助。

于 2013-04-05T12:53:47.573 回答
1

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

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

于 2013-04-05T13:03:43.003 回答