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();
}
我正在创建一个选择屏幕,假设有两个字段 "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();
}