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

时间:2015-12-03 10:00:48

标签: data-annotations asp.net-mvc-validation

我正在创建一个选择屏幕,假设有两个字段"开始日期"和"结束日期"和"搜索"按钮。

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

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; }
}

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

    // 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);
    }

所以我在开始/结束日期字段中输入了错误的日期,然后单击&#34;搜索&#34;,程序只是忽略验证并生成文件。

(注意:我没有把所有代码粘贴到这里以保持简单,但我已经证明日期验证逻辑是正确的。)

1 个答案:

答案 0 :(得分:0)

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

我发现我应该包含&#34; if(ModelState.Isvalid)&#34;在HttpPost方法中。

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

        return View();
    }