So gehen Sie vor:
Definieren Sie zunächst das benutzerdefinierte Validierungsattribut:
public class FutureDateAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value == null || (DateTime)value < DateTime.Now)
return false;
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "futuredate"
};
}
}
Beachten Sie, wie IClientValidatable implementiert wird . Als nächstes schreiben wir unser Modell:
public class MyViewModel
{
[FutureDate(ErrorMessage = "Should be in the future")]
public DateTime Date { get; set; }
}
Dann ein Controller:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel
{
Date = DateTime.Now.AddDays(-1)
});
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
und zum Schluss noch ein Blick:
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Date)
@Html.TextBoxFor(x => x.Date)
@Html.ValidationMessageFor(x => x.Date)
<input type="submit" value="OK" />
}
Der letzte Teil, in dem die Magie stattfinden kann, besteht darin, den benutzerdefinierten Adapter zu definieren:
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
jQuery.validator.addMethod('greaterThan', function (value, element, params) {
if (!/Invalid|NaN/.test(new Date(value))) {
return new Date(value) > new Date($(params).val());
}
return isNaN(value) && isNaN($(params).val()) || (parseFloat(value) > parseFloat($(params).val()));
}, '');
jQuery.validator.unobtrusive.adapters.add('futuredate', { }, function (options) {
options.rules['greaterThan'] = true;
options.messages['greaterThan'] = options.message;
});
</script>
return new Date(value) > new Date($(params).val());
zureturn new Date(value) > new Date();
. neues Datum ($ (params) .val ()) bis neues Datum ()Es hat eine Weile gedauert, bis Ihre Frage gestellt wurde. Wenn Sie jedoch immer noch Metadaten mögen und immer noch offen für vereinfachte Alternativen sind, können Sie Ihr Problem mithilfe der folgenden Anmerkungen lösen:
[Required] [AssertThat("Date > Now()")] public DateTime? Date { get; set; }
Es funktioniert sowohl für Server als auch für Clients. Weitere Informationen finden Sie in der ExpressiveAnnotations- Bibliothek.
quelle