首页 > 解决方案 > ASP.NET 核心 MVC 自定义验证比较日期

问题描述

我的剃刀视图上有两个日期,我需要对此进行验证,如果 To date 小于 from date,则使用数据注释显示错误。当我在调试模式下运行代码时,断点命中但它没有在页面上呈现错误。如果模型状态无效,它会以相同的方式再次显示表单下面是我的代码,我做错了什么。

public class AcctViewModel: IValidatableObject
{

 [Key] public long AccountId { get; set;}

  [Display(Name = "Account Name"), DataType(DataType.Text), StringLength(15), Required]
  public string AcctName {get;set;}
   
   [Display(Name = "From Date"), DataType(DataType.Date), Required]
   public DateTime FromDate { get; set; }

   [Display(Name = "To Date"), DataType(DataType.Date), Required]
   public DateTime ToDate { get; set; }


   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            List<ValidationResult> errors = new List<ValidationResult>();
            if (ToDate < FromDate)
            {
                errors.Add(new ValidationResult($"{nameof(ToDate)} needs to be greater than From date.", new List<string> { nameof(ToDate) }));
            }
            return errors;
        }

}

 <div class="form-row">
                        <div class="col-md-12">
                            <div class="form-group form-group--float">
                                <input class="form-control date-picker" asp-for="ToDate">
                                <label asp-for="ToDate"></label>
                              
                                <div class="invalid-tooltip"><span asp-validation-for="ToDate"></span></div>
                                <i class="form-group__bar"></i>
                            </div>
                        </div>
                    </div>

                </div>

标签: asp.netasp.net-coremodel-view-controllerdata-annotations

解决方案


控制器:

 public IActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public IActionResult Index(AcctViewModel model)
        {
            if (ModelState.IsValid)
            {

            }
            return View(model);
        }

看法:

   <form asp-action="Index">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="AccountId" class="control-label"></label>
                <input asp-for="AccountId" class="form-control" />
                <span asp-validation-for="AccountId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="AcctName" class="control-label"></label>
                <input asp-for="AcctName" class="form-control" />
                <span asp-validation-for="AcctName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="FromDate" class="control-label"></label>
                <input asp-for="FromDate" class="form-control" />
                <span asp-validation-for="FromDate" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ToDate" class="control-label"></label>
                <input asp-for="ToDate" class="form-control" />
                <span asp-validation-for="ToDate" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>

模型:

   public class AcctViewModel : IValidatableObject
    {
        [Key] 
        public long AccountId { get; set; }

        [Display(Name = "Account Name"), DataType(DataType.Text), StringLength(15), Required]
        public string AcctName { get; set; }

        [Display(Name = "From Date"), DataType(DataType.Date), Required]
        public DateTime FromDate { get; set; }

        [Display(Name = "To Date"), DataType(DataType.Date), Required]
        public DateTime ToDate { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            List<ValidationResult> errors = new List<ValidationResult>();
            if (ToDate < FromDate)
            {
                errors.Add(new ValidationResult($"{nameof(ToDate)} needs to be greater than From date.", new List<string> { nameof(ToDate) }));
            }
            return errors;
        }
    }

推荐阅读