我正在创建一个选择屏幕,假设有两个字段"开始日期"和"结束日期"和"搜索"按钮。
我创建了自定义属性,用于验证日期字段,使其必须属于动态日期范围:
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;,程序只是忽略验证并生成文件。
(注意:我没有把所有代码粘贴到这里以保持简单,但我已经证明日期验证逻辑是正确的。)
答案 0 :(得分:0)
很抱歉,我在发布问题后不久就找到了我的解决方案。 (我在MVC中真的很新)
我发现我应该包含&#34; if(ModelState.Isvalid)&#34;在HttpPost方法中。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SelectionScreen(SelectionParametersModel selectionParameter)
{
if (ModelState.IsValid)
{
... Code ....
}
return View();
}