Eseguire la validazione lato client per l’attributo personalizzato

Ho creato un attributo di convalida personalizzato:

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

Come posso farlo funzionare anche dal lato client con jquery?

Ecco come procedere:

Inizia definendo l’attributo di convalida personalizzato:

 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" }; } } 

Si noti come implementa IClientValidatable . Successivamente scriviamo il nostro modello:

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

Quindi un controller:

 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); } } 

e infine una vista:

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

L’ultima parte per cui la magia può accadere è definire l’adattatore personalizzato:

    

Ci è voluto un po ‘di tempo dall’ultima domanda, ma se ti piacciono ancora i metadati e sei ancora aperto a alternative semplificate, puoi risolvere il tuo problema usando le seguenti annotazioni:

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

Funziona sia per il server che per il client, pronto all’uso. Per ulteriori dettagli, consulta la libreria ExpressiveAnnotations .