0

我正在尝试实现自定义客户端验证,但它不起作用。我基于 Codeproject 上的文章http://www.codeproject.com/Articles/275056/Custom-Client-Side-Validation-in-ASP-NET-MVC3

我也看过这里,但我认为我正在以正确的方式实现它,但我忽略了一些东西。我的目标是验证日期(必需的日期格式,并且不早于表单上的另一个日期)。前两个可以通过数据注释来完成,最后一个我必须通过自定义验证来完成。

我的基类上有一些数据注释(ClassLibrary 在 VB.NET 中):

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(CM_CONTRACTVALIDATIONData))>
Partial Public Class CM_CONTRACTACTIVATION
    '...
End Class

Public Class CM_CONTRACTVALIDATIONdata
'...
<DataType(DataType.Date)>
<Required()>
Public Property TakeBackDeviceWhen
'..
End Class

在 javascript 文件中,我添加了自定义方法:

//validation
$.validator.addMethod("checkPickupDate", function (value, element) {
    return false;
});
$("#form").validate({
    rules: {
        TakeBackDeviceWhen: {
            checkPickupDate: true
        }
    },
    messages: {
        TakeBackDeviceWhen: {
            checkPickupDate: "Test"
        }
    }
}
);

我的 chtml 文件如下:

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "", new { style = "Width: 200px" })

生成的 HTML 如下:

<input id="TakeBackDeviceWhen" class="hasDatepicker" type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" data-val-required="The TakeBackDeviceWhen field is required." data-val="true">

似乎我的类型验证和自定义验证都没有实现。

出了什么问题?

4

1 回答 1

1

好的,解决了。我希望 :-)

今天学到了什么: (1)不要使用EditorFor:当你从MVC模板脚手架时,输入字段生成到EditorFor,似乎你不能添加自定义的不显眼的验证标签。所以,我试图解决这个问题,直到我将其更改为 TextBoxFor。

(2) 可以在 jQuery 中添加自定义验证方法,但不能将它们与不显眼的验证混合使用。添加自定义方法后,您还必须将其添加到不显眼的适配器中。并且不要忘记在底部添加 jQuery :-s (我从jQuery.validator.unobtrusive.adapters.addMinMax 往返中得到这个,在 MVC3 中不起作用

$(function () {
$.validator.addMethod("checkpickupdate", function (value, element) {
    if (value == "20/09/2012") {
        return false;
    } else {
        return true;
    }
});

$.validator.unobtrusive.adapters.addBool("checkpickupdate");
} (jQuery));

(3) 在 htmlAttributes 中的输入字段中添加验证标签:

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "",
                new { 
                    style = "Width: 200px", 
                    data_val = "true", 
                    data_val_required = "verplicht!",
                    data_val_date = "moet datum zijn",
                    data_val_checkpickupdate = "wow"
                 })

(4) 数据类型数据注释不会强制验证。您必须像在 (3) 中一样添加它。您可以添加自定义 ValidationAttribute (用于服务器端验证):

public class MustBeDateAttribute : ValidationAttribute {
    public override bool IsValid(object value) {
        try
        {
            DateTime dte = DateTime.Parse(value.ToString());
            return true;
        }
        catch (Exception)
        {
            return false;
            throw;
        }
    }
}

这是生成的 html 输出:

<input type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" id="TakeBackDeviceWhen" data-val-required="required!" data-val-date="has to be a date" data-val-checkpickupdate="custom error" data-val="true" class="hasDatepicker valid">

当我在不同的项目中使用我的 ClassLibrary 时,我现在将尝试从类库中分离 dataannotations 元数据(可能使用依赖解析器)。

于 2012-09-20T09:47:30.827 回答