Realice la validación del lado del cliente para el atributo personalizado

Creé un Atributo de Validación Personalizado:

public class FutureDateAttribute : ValidationAttribute { public override bool IsValid(object value) { if (value == null|| (DateTime)value < DateTime.Now) return false; return true; } } 

¿Cómo puedo hacer que esto funcione en el lado del cliente también con jquery?

A continuación, le indicamos cómo proceder:

Comience definiendo el atributo de validación personalizado:

 public class FutureDateAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) { if (value == null || (DateTime)value < DateTime.Now) return false; return true; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "futuredate" }; } } 

Observe cómo implementa IClientValidatable . Luego escribimos nuestro modelo:

 public class MyViewModel { [FutureDate(ErrorMessage = "Should be in the future")] public DateTime Date { get; set; } } 

Entonces un controlador:

 public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel { // intentionally put in the past Date = DateTime.Now.AddDays(-1) }); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 

y finalmente una vista:

 @using (Html.BeginForm()) { @Html.LabelFor(x => x.Date) @Html.TextBoxFor(x => x.Date) @Html.ValidationMessageFor(x => x.Date)  } 

La última parte para que la magia suceda es definir el adaptador personalizado:

    

Tomó un poco de tiempo desde que se hizo su pregunta, pero si todavía le gustan los metadatos, y todavía está abierto para las alternativas simplificadas, puede resolver su problema utilizando las siguientes anotaciones:

 [Required] [AssertThat("Date > Now()")] public DateTime? Date { get; set; } 

Funciona tanto para el servidor como para el cliente, de fábrica. Para obtener más detalles, eche un vistazo a la biblioteca ExpressiveAnnotations .