MVC5 - 检查用于搜索日期字段的 2 个日期(文本框)之间的重叠
本文关键字:日期 文本 重叠 之间 搜索 用于 字段 MVC5 检查 | 更新日期: 2023-09-27 18:35:25
我目前正在考虑创建一些搜索选项来过滤我的模型结果。我有一个 RunDate 字段,我想使用 2 个文本框字段进行搜索。
@Html.TextBox("StartDate", null, new { @class = "datefield form-control", type = "date" })
@Html.TextBox("EndDate", null, new { @class = "datefield form-control", type = "date" })
<input type="submit" class="btn btn-primary" value="Search" />
和我的控制器索引任务
public async Task<ActionResult> Index(int? jobId, int? page, DateTime? StartDate, DateTime? EndDate)
......
......
if (StartDate.HasValue )
{
jobs = jobs.Where(s => s.RunAfter >= StartDate);
pageNumber = 1;
}
if (EndDate.HasValue)
{
jobs = jobs.Where(s => s.RunAfter <= EndDate);
pageNumber = 1;
}
但是,如果日期重叠不正确,我想停止搜索,例如。开始日期>结束日期。
最好的方法是什么?我必须使用 Javascript 并在我的输入点击中添加 validate() 吗?
我已经研究了请求验证,但现在已经过时了。
我还可以添加一个验证结果,例如
if (StartDate > EndDate)
{
return new ValidationResult("EndDate must be greater than StartDate");
}
但我不确定在哪里添加这个。那么基本上使用最有效的方法验证这些表单字段的最佳方法是什么?
如果将
表单域包装到 ViewModel 中,则此模型可以实现IValidatableObject
。
public class SearchViewModel : IValidatableObject {
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
// other properties ...
// will be called automatically to check ModelState.IsValid
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (StartDate > EndDate) {
yield return new ValidationResult("EndDate must be greater than StartDate", "EndDate");
}
// other checks here, also yield ValidationResult ...
}
}
并在操作中检查模型状态:
public async Task<ActionResult> Index(SearchViewModel postData) {
if (!ModelState.IsValid) {
// error handling, e.g. return View Index again (errors will already have been added)
}
// no error -> continue
}
错误列表可以在 Razor 中呈现,如下所示:
@Html.ValidationSummary()