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 回答