MVC5:单击提交按钮时不会触发自定义验证

MVC5: Custom validations are not triggered when Submit button is clicked

我正在创建一个选择屏幕,假设有两个字段 "Start Date" 和 "End Date" 以及一个 "Search" 按钮。

我创建了自定义属性来验证日期字段,使其必须在动态日期范围内:

public class YearTimeFrameAttribute : ValidationAttribute
{
    private DateTime _minDate;

    public YearTimeFrameAttribute(int timeFrameInYear)
    {
        int _timeFrame = Math.Abs(timeFrameInYear) * -1;
        _minDate = DateTime.Now.AddYears(_timeFrame);
    }

    public override bool IsValid(object value)
    {
        DateTime dateTime = Convert.ToDateTime(value);
        if (dateTime < _minDate)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format("The field {0} must be >= {1}", name, _minDate.ToString("dd/MM/yyyy"));
    }

}

下面是选择屏幕模型中的代码:

public class SelectionParametersModel
{
    [YearTimeFrame(7)]
    [DataType(DataType.Date)]
    [Display(Name = "Extraction Start Date")]
    public DateTime StartDate { get; set; }

    [YearTimeFrame(7)]
    [DataType(DataType.Date)]
    [Display(Name = "Extraction End Date")]
    public DateTime EndDate { get; set; }
}

最后我的控制器执行此操作(我正在尝试 return 一个文件):

    // GET: /SelectionScreen/
    public ActionResult SelectionScreen()
    {
        ViewBag.Title = "Selection Screen";
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SelectionScreen(SelectionParametersModel selectionParameter)
    {
        ... Code to build report ...

        string mimeType;
        Byte[] renderedBytes;
        Functions.GenerateReport(out renderedBytes, out mimeType);
        return File(renderedBytes, mimeType);
    }

所以我在 start/end 日期字段中输入了错误的日期并单击 "Search",程序只是忽略验证并生成文件。

(注意:为了简单起见,我没有将所有代码粘贴在这里,但我已经证明了日期验证逻辑是正确的。)

抱歉,我在发布问题后不久就找到了解决方案。 (我真的是 MVC 新手)

我发现我应该在 HttpPost 方法中包含 "if (ModelState.Isvalid)"。

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SelectionScreen(SelectionParametersModel selectionParameter)
    {
        if (ModelState.IsValid)
        {
            ... Code ....
        }

        return View();
    }