5

我有一个包含两个日期字段的表单,开始日期和结束日期。我想验证这两个字段以确保开始日期在结束日期之前或之前。我已经编写了一个远程验证器并将其分配给这两个字段,但这可能会导致同一错误出现多条消息。此外,如果我更正一个日期,验证不会在未修改的字段上触发,留下旧的错误消息

如何相互验证两个日期字段以验证开始日期是在结束日期之前还是结束日期?

4

1 回答 1

2

几周前我遇到了同样的问题。恕我直言,我认为解决问题的最佳方法是使用 jquery 实现客户端控制。通过这种方式,您可以在每次更改 StartDate 或 EndDate 的值时调用验证。在这种情况下,最好调用服务器来验证客户端上的数据,因为您不调用服务器。

在以下链接中,有一个实现客户端验证的过程。 关联

这是我的解决方案:

第 1 步:创建属性类以验证连续日期

public class ConsecutiveDateAttribute : ValidationAttribute, IClientValidatable
{
    public ConsecutiveDateAttribute()
    {
        ErrorMessage = "The date must be consecutive";
    }

    public override bool IsValid(object value)
    {
        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationParameters.Add("datefield", metadata.PropertyName);
        rule.ValidationType = "consecutivedate";
        yield return rule;
    }
}

IsValid 方法总是返回 true,因为我想在客户端验证值。GetClientValidationRules 函数用于将一对字段名称和事件验证名称传递给 cshtml 页面,以调用每个字段的验证。

第 2 步:使用属性 ConsecutiveDate 装饰我要验证的字段

    [Required(), DataType(DataType.Date), ConsecutiveDate()]
    public DateTime StartDate { get; set; }

    [Required(), DataType(DataType.Date), ConsecutiveDate()]
    public DateTime EndDate { get; set; }

第 3 步:在页面中实现 javascript 以验证日期

<script src="@Url.Content("~/Scripts/jquery-1.10.2.js")" type="text/javascript" />
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript" />
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

<script type="text/javascript">

    if ($.validator && $.validator.unobtrusive) {

        $.validator.unobtrusive.adapters.addSingleVal("consecutivedate", "datefield");

        $.validator.addMethod("consecutivedate", function(value, element) {

            if ($("#StartDate").val() != "" && $("#EndDate").val() != "")
                return $("#StartDate").val() <= $("#EndDate").val();

            // IF both values are not polupated I don't want to validate the field
            return true;
        });

    }
</script>

$.validator.addMethod("consecutivedate", function(value, element) :这为我要验证的每个字段注册验证。

于 2014-07-01T16:04:35.850 回答