【问题标题】:ASP MVC 5 Client Validation for Range of Datetimes日期时间范围的 ASP MVC 5 客户端验证
【发布时间】:2014-11-28 05:44:50
【问题描述】:

我想检查表单中的日期时间字段。该字段在 2008 年 1 月 10 日至 2008 年 1 月 12 日之间有效。以下是我定义 viewmodel 属性的方式:

    [Required(ErrorMessage = "The date value is mandatory")]
    [DataType(DataType.DateTime)]
    [Range(typeof(DateTime), "01/10/2008", "01/12/2008")]
    [DisplayName("When the work starts")]
    public DateTime StartWork { get; set; }

我想在客户端验证这一点。但我总是得到一个错误。我给出的值是 2008 年 1 月 11 日,它告诉我,日期必须定义在 2008 年 1 月 10 日和 2008 年 1 月 12 日之间。我读到它不能在没有 jquery 的情况下进行客户端验证,不是吗?还是我忘记了什么?有什么替代方法可以解决这个问题。

【问题讨论】:

    标签: c# jquery asp.net-mvc


    【解决方案1】:

    我认为您可以使用 MVC 中的自定义验证来实现这一点。试试这个:

    [ValidateDateRange]
    public DateTime StartWork { get; set; }
    

    这是您的自定义验证实现:

    namespace MVCApplication
        {   
    
            public class ValidateDateRange: ValidationAttribute
            {
                protected override ValidationResult IsValid(object value, ValidationContext validationContext)
                {                 
                   // your validation logic
                    if (value >= Convert.ToDateTime("01/10/2008") && value <= Convert.ToDateTime("01/12/2008") )
                    {
                        return ValidationResult.Success;
                    }
                    else
                    {
                        return new ValidationResult("Date is not in given range.");
                    }
                }
            }
        }
    

    更新:

    您还可以将日期范围作为参数传递,以使验证成为通用的:

    [ValidateDateRange(FirstDate = Convert.ToDateTime("01/10/2008"), SecondDate = Convert.ToDateTime("01/12/2008"))]
    public DateTime StartWork { get; set; }
    

    自定义验证:

        namespace MVCApplication
            {   
    
                public class ValidateDateRange: ValidationAttribute
                {
                  public DateTime FirstDate { get; set; }
                  public DateTime SecondDate { get; set; }
    
                    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
                    {                 
                        // your validation logic
                        if (value >= FirstDate && value <= SecondDate)
                        {
                            return ValidationResult.Success;
                        }
                        else
                        {
                            return new ValidationResult("Date is not in given range.");
                        }
                    }
                }
            }
    

    更新 2:(对于客户端) 一个非常简单的 jQuery 逻辑应该进行客户端验证。检查以下:

    $(document).ready(function(){
    
      $("#btnSubmit").click(function(){
    
        var dt = $("#StartWork").val();
    
        var d = new Date(dt);
        var firstDate = new Date("2008-01-10");
        var secondDate = new Date("2008-01-12");
    
        if(d>= firstDate && d<= secondDate)
        {
          alert("Success");
        }
        else
        {
          alert("Date is not in given range.");
        }
    
      });
    
    });
    

    请查看此 JSFiddle 以查看工作演示:Date Range Validation

    【讨论】:

    • 这是我将采取的路线,但我还将添加日期范围以验证为参数,以便代码可以重复用于所有不同类型的日期范围
    • 谢谢,我会试试这个建议!
    • 但是您的自定义验证仅适用于服务器端验证,客户端验证需要将匹配的 ValidationType 放入 Javascript。如果在 Javascript 中找不到自定义的 ValidationType,则必须将新的 javascript 函数添加到 java 脚本文件中。如果您有多个使用正则表达式作为 ValidationType 的自定义验证,请保留我的信息,那么您不能同时验证它们。一个 Web 控件只允许一个正则表达式验证。
    • 要在客户端进行验证,ValidateDateRangeAttribute 应该只实现 IClientValidatable 接口,不是吗?在客户端,我应该创建一个适配器来添加新规则。这行得通吗?
    • 你可以尝试,但我总是更喜欢使用 jQuery 进行客户端验证。
    【解决方案2】:

    您必须在属性上以某种格式指定日期,并且您还必须以该格式提供值。日期输入不喜欢MM/dd/yyyy,即使那是它显示的格式!恕我直言,相当迟钝。

    你需要像这样添加最小值和最大值:

    生成的 HTML

    <input class="form-control text-box single-line input-validation-error" data-val="true" data-val-date="The field DOB must be a date." data-val-required="The DOB field is required." id="DOB" name="DOB" type="date" value="1932-01-01" aria-required="true" aria-describedby="DOB-error" aria-invalid="true" min="1932-01-01" max="2015-01-01">
    

    型号

    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [DataType(DataType.Date)]
    public DateTime DOB { get; set; }
    

    查看

    @Html.EditorFor(model => model.DOB, new { htmlAttributes = new { @class = "form-control", min = "1900-01-01", max = "2015-01-01" } })
    

    然后您将在 UI 中获得最小或最大错误:

    【讨论】:

      【解决方案3】:

      虽然这部分内容之前已发布并被否决为无效。只要您指定了范围和格式字符串,我就可以确认这确实有效。

      [Required]
      [DataType(DataType.Date)]
      [DisplayFormat(DataFormatString = "{0:mm-dd-yyyy}", ApplyFormatInEditMode = true)]
      [Range(typeof(DateTime), "1/1/1900", "12/31/2018",
          ErrorMessage = "Value for {0} must be between {1} and {2}")]
      [Display(Name = "Date of Birth")]
      public DateTime DateOfBirth { get; set; }
      

      【讨论】:

      • 对我不起作用。
      【解决方案4】:

      检查范围日期也可以使用 FluentValidation 来完成,这可能是您问题的另一种解决方案,请查看我对她的回答。希望这会有所帮助

      MVC model validation for date

      【讨论】:

        【解决方案5】:

        使用 DataFormat 属性将日期格式明确指定为,

        [DisplayFormat(DataFormatString="{0:C}")]
        

        参考MSDN doc

        【讨论】:

        • 对客户端的验证有帮助吗?
        • 我找到了这个链接http://stackoverflow.com/questions/21777412/mvc-model-validation-for-date。看来,jquery 不适用于范围
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2020-11-06
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        相关资源
        最近更新 更多