即使Model.IsValid返回true,也会显示错误



我正在制作一个从SQL数据库中提取一些信息的网站。我制作了一个模型,用于在尝试查询之前验证我是否拥有所需的信息。这意味着(如果一切顺利)该方法将始终解析,并且Model.IsValid将为true。查询的目的是获取两个给定日期之间的所有行。

现在我的问题来了——当它进入ActionResult,调用查询时,我首先想检查返回的行数是否小于1000。

如果是<1000我希望它显示带有行的视图,但是如果它大于1000,我希望显示一条错误消息,告诉用户缩小搜索标准。

我可能完全错了,我最初的想法是"简单地"将验证器更改为不再有效。这将自动触发来自模型的错误消息。经过四处搜寻,这似乎不可能。

有人知道怎么做吗?我的做法完全错了吗?

验证器型号:

public class DateValidator
{        
[Required]
public DateTime StartDateTime { get; set; }
[Required]
public DateTime EndDateTime { get; set; }
}

操作结果:

public ActionResult GetListFromDateRange(DateValidator validator)
{
RangeParent parent = new RangeParent();
if (ModelState.IsValid)
{
int queryCount =
repository.GetCountFromDateRange(validator.StartDateTime,
validator.EndDateTime);
if (queryCount < 1000)
{
parent.Meters =
repository.GetListFromDateRange(validator.StartDateTime,
validator.EndDateTime);
return View(Constants.ViewNames.DisplayRangeData, parent);
}
else
{
//display error message telling user to narrow the datetime range
return new EmptyResult();
}
}
return View(Constants.ViewNames.IndexView);
}

最后是我目前使用的两个查询:

public List<Meter> GetListFromDateRange(DateTime startDateTime, DateTime endDateTime)
{
using (dbContext = new HeatDataVerifEntities())
{
return dbContext.Meters.Where(p => p.Created >= startDateTime && p.Created <= endDateTime).OrderBy(p => p.Created).ToList();
}
}
public int GetCountFromDateRange(DateTime startDateTime, DateTime endDateTime)
{
using (dbContext = new HeatDataVerifEntities())
{
return dbContext.Meters.Where(p => p.Created >= startDateTime && p.Created <= endDateTime).Count();
}
}

我考虑的另一件事是创建另一个ActionResult,它运行我将调用的行大小检查,而不是"GetListFromDateRange",然后让它返回一个空的局部视图,同时调用获取项列表的方法,或者返回一个包含错误消息的局部视图。这似乎是一个更容易或更聪明的解决方案。

我一直在四处寻找,但正如我也提到的,我可能只是看错了这个。

提前谢谢。

在一个页面上显示大约1000条记录并不完全有用,而且它会影响很多事情,例如数据库的性能,这取决于有多少用户同时请求数据,网站向用户显示数据的速度,如果同时请求太多数据集,最终您的网站可能会完全崩溃。

相反,为什么不简单地添加分页呢?决定一个页面大小,比如20,从查询中返回这些记录,以及显示所有数据所需的页面数量。然后,您可以使用它来构建页面分页本身。因此,从数据库返回的行数永远不会超过20行,压力很小,站点运行速度很快。

按照现在的方式,您正在请求大量数据,如果您有1000多条记录,您所要做的就是显示一条错误消息,期望用户再次请求。虽然你已经有了数据,但除了计数之外,你不会把它用于其他任何事情。除非是一门课程,否则您所要做的就是先运行一个计数,如果小于1000,则运行实际的查询。

模型验证是在输入而不是输出上运行的,我不建议你尝试改变MVC的工作方式,只是为了适应一个无论如何都不应该发生的特定场景。

如果您想继续您的想法,请首先运行计数查询,如果结果超过1000,则返回一条错误消息并显示给用户。您可以在没有任何自定义、非模型验证的情况下完成此操作。

您总是可以添加一条自定义错误消息,该消息将显示在ValidationSummary

ModelState.AddModelError(string.Empty, "My own error message");

相关内容

最新更新