2

入力された日付が未来かどうかをチェックする 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 が返されますが、エラーを表示する代わりに、コントローラーのアクションを呼び出して無効なモデルを送信します。

私は何か間違ったことをしていますか?どうすれば修正できますか?

4

3 に答える 3

2

クライアント側の検証ロジックを追加しましたか:カスタムバリデーターと目立たないアダプター。そうでない場合は、クライアント側のロジックは次のとおりです。

//クライアント側のバリデーターを追加します:

jQuery.validator.addMethod("wrongvalue",
 function (value, element, param) {

    var dateValue = $.datepicker.parseDate('dd/mm/yy', value); //use any date parser, if UI/Datepicker is not used

    var now = new Date();
    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());

    var isValid = dateValue >= today;
    return isValid;
});

//目立たないアダプタを追加します:

jQuery.validator.unobtrusive.adapters.add("wrongvalue", [], function (options) {

    options.rules["wrongvalue"] = true;
    options.messages["wrongvalue"] = options.message;
});
于 2012-04-09T20:07:52.330 に答える
1

ありますか:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

あなたのweb.configで?

ページまたはマスター/レイアウトに jquery、jquery.validate、および jquery.validate.unobtrusve JavaScript を含めていますか?

于 2012-04-07T21:09:32.583 に答える
0

私も同じ問題を抱えていました。MVC4 のデフォルトのプロジェクト テンプレートには、jquery.validate.min.js ファイルと jquery.validate.js ファイルの両方が含まれていました。そして、jquery.validate.unobtrusive.js および jquery.validate.unobtrusive.min.js ファイルが含まれていました。

jquery.validate.min.js と jquery.validate.unobtrusive.min.js を削除しましたが、カスタムの日付バリデータは正常に動作しているようです。

于 2012-04-07T23:23:11.743 に答える