Asp.net mvc 数据注释自定义属性[日期时间]

Asp.net mvc 数据注释自定义属性[日期时间],asp.net-mvc,data-annotations,Asp.net Mvc,Data Annotations,我正在尝试将数据验证添加到我的DateTime属性中,我想强制用户选择介于DateTime.Now和DateTime.Now.addyears(+1) 这是我的代码: public class DateDebut : ValidationAttribute { public override bool IsValid(object value) { if (value == null) return

我正在尝试将数据验证添加到我的DateTime属性中,我想强制用户选择介于
DateTime.Now
DateTime.Now.addyears(+1)
这是我的代码:

 public class DateDebut : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if (value == null) return false;
                DateTime enteredDate = (DateTime)value;

                if ( (enteredDate >= DateTime.Now) && (enteredDate <= DateTime.Now.AddYears(+1)))
                    return true;
                else
                    return false;
            }
        }
        [Required]
        [Display(Name = "De : ")]
        [DataType(DataType.Date)]
        [DateDebut(ErrorMessage="Date invalide")]
        public DateTime dd { get; set; }
公共类DateFirst:ValidationAttribute
{
公共覆盖布尔值有效(对象值)
{
if(value==null)返回false;
DateTime enteredDate=(DateTime)值;

如果((enteredDate>=DateTime.Now)&&(enteredDate属性本质上是静态的。您是否考虑过编写自己的属性进行验证?web上有几个示例可以帮助您开始


您还可以从
RangeAttribute
继承并根据需要注入它。

属性本质上是静态的。您是否考虑过编写自己的属性进行验证?web上有几个示例可以帮助您开始


您也可以从
RangeAttribute
继承并根据需要注入它。

我完全同意Daniel

然而,我发现当我需要在模型中比较属性时,我使用了IValidatableObject

我发现对于大多数小类型的比较来说,它更快、更容易 你会有一些像这样的

public class myModel : IvalidatableObject
{
 string debut = DateTime.Now.ToShortDateString();
 string fin = DateTime.Now.AddYears(+1).ToShortDateString(); 
 [Required]
 [Display(Name = "De : ")]
 [DataType(DataType.Date)]
 public DateTime dd { get; set; }

  public IEnumerable<ValidationResult> Validate()
  {
    if(this.debut > this.fin)
    {
      yield return new ValidationResult("debut cannot be greated then fin");
    }
  }
}
公共类myModel:IvalidatableObject
{
字符串首秀=DateTime.Now.ToShortDateString();
string fin=DateTime.Now.AddYears(+1).toSortDateString();
[必需]
[显示(Name=“De:”)]
[数据类型(DataType.Date)]
公共日期时间dd{get;set;}
公共IEnumerable验证()
{
如果(this.处子秀>this.fin)
{
返回新的ValidationResult(“首次登场不能比最终登场更大”);
}
}
}

读一读,看看什么对你最好

我完全同意丹尼尔的观点

然而,我发现当我需要在模型中比较属性时,我使用了IValidatableObject

我发现对于大多数小类型的比较来说,它更快、更容易 你会有一些像这样的

public class myModel : IvalidatableObject
{
 string debut = DateTime.Now.ToShortDateString();
 string fin = DateTime.Now.AddYears(+1).ToShortDateString(); 
 [Required]
 [Display(Name = "De : ")]
 [DataType(DataType.Date)]
 public DateTime dd { get; set; }

  public IEnumerable<ValidationResult> Validate()
  {
    if(this.debut > this.fin)
    {
      yield return new ValidationResult("debut cannot be greated then fin");
    }
  }
}
公共类myModel:IvalidatableObject
{
字符串首秀=DateTime.Now.ToShortDateString();
string fin=DateTime.Now.AddYears(+1).toSortDateString();
[必需]
[显示(Name=“De:”)]
[数据类型(DataType.Date)]
公共日期时间dd{get;set;}
公共IEnumerable验证()
{
如果(this.处子秀>this.fin)
{
返回新的ValidationResult(“首次登场不能比最终登场更大”);
}
}
}

仔细阅读,看看什么最适合你

这没有理由不起作用。发布你的控制器操作代码。查看代码和工作代码我忘了添加一些其他参数,但我想知道如何在客户端启用此验证,我已激活客户端验证,它可用于其他表单,但不在中这一个。您需要编写自定义Javasscript来执行等效的客户端验证。它在客户端用于其他验证的原因是因为您包含了Microsoft包含的不引人注目的库。没有理由这不起作用。发布控制器操作的代码。查看代码如下:我忘了添加一些其他参数,但我想知道如何在客户端启用此验证,我已经激活了客户端验证,它对其他表单有效,但不是在这个表单中。您需要编写自定义Javasscript来执行等效的客户端验证。这就是为什么它对ot在客户端有效她的确认是因为你包含了微软包含的不引人注目的库