MVC.NET自定义验证器无法正常工作

时间:2012-04-07 20:00:29

标签: jquery asp.net-mvc jquery-ui validation jquery-validate

我想为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 }; 
        }
    }

并将属性添加到我想要检查的字段中。

在View页面上,我按以下方式创建输入字段:

<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,但是它不会显示错误而只是调用我的控制器的操作并向其发送无效模型。

我做错了吗?我该如何解决?

3 个答案:

答案 0 :(得分: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;
});

答案 1 :(得分:1)

你有:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
你的web.config中的

您是否在页面或主/布局中包含jquery,jquery.validate和jquery.validate.unobtrusve javascript?

答案 2 :(得分: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,我的自定义日期验证器似乎工作正常。