入力された日付が未来かどうかをチェックする MVC.NET フレームワーク用のカスタム バリデータを作成したいと考えています。そのために、次のクラスを作成しました。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class InTheFutureAttribute : ValidationAttribute, IClientValidatable
{
private const string DefaultErrorMessage = "{0} should be date in the future";
public InTheFutureAttribute()
: base(DefaultErrorMessage)
{
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name);
}
public override bool IsValid(object value)
{
DateTime time = (DateTime)value;
if (time < DateTime.Now)
{
return false;
}
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "wrongvalue"
};
return new[] { clientValidationRule };
}
}
チェックしたいフィールドに属性を追加しました。
ビューページで、次の方法で入力フィールドを作成します。
<div class="editor-label-search">
@Html.LabelFor(model => model.checkIn)
</div>
<div class="editor-field-search-date">
@Html.EditorFor(model => model.checkIn)
<script type="text/javascript">
$(document).ready(function ()
{ $('#checkIn').datepicker({ showOn: 'button', buttonImage: '/Content/images/calendar.gif', duration: 0, dateFormat: 'dd/mm/yy' }); });
</script>
@Html.ValidationMessageFor(model => model.checkIn)
</div>
バリデーターでチェックされた属性コードを持つモデルを必要とするコントローラーのフォームを送信すると、呼び出されて false が返されますが、エラーを表示する代わりに、コントローラーのアクションを呼び出して無効なモデルを送信します。
私は何か間違ったことをしていますか?どうすれば修正できますか?