我正在建立一个从SQL DB中提取一些信息的网站。 在尝试查询之前,我已经建立了一个模型来验证我是否拥有所需的信息。这意味着(如果一切顺利的话)该方法将始终解析,并且Model.IsValid为true。查询是获取两个给定日期之间的所有行。
现在出现了我的问题-当它进入ActionResult并在其中调用查询时,我首先要检查返回的行数是否少于1000。
如果它小于<1000,我希望它显示带有行的视图,但是如果它大于1000,我希望显示一条错误消息,告诉用户缩小搜索条件。
我可能会以完全错误的方式进行操作,而我最初的想法是“简单地”将验证器更改为不再有效。这将自动触发来自模型的错误消息。经过搜索之后,似乎不太可能。
任何人都知道如何进行此操作?我的方法完全错误吗?
ValidatorModel:
public class DateValidator
{
[Required]
public DateTime StartDateTime { get; set; }
[Required]
public DateTime EndDateTime { get; set; }
}
ActionResult:
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'-然后让它要么返回空的局部视图,要么调用用于获取列表的方法项,或返回其中包含错误消息的局部视图。似乎应该/应该是一个更简单或更聪明的解决方案。
同样,我一直在搜寻,但是正如我也提到的,我可能只是在看这个错误。
谢谢。
答案 0 :(得分:1)
您始终可以添加一条自定义错误消息,该消息将显示在ValidationSummary
ModelState.AddModelError(string.Empty, "My own error message");
答案 1 :(得分:1)
在一页上显示大约1000条记录并不是完全有用,而且会影响很多事情,例如数据库的性能,这取决于同时有多少用户请求数据,网站将数据显示到网站的速度有多快用户,如果同时请求太多数据集,最终您的网站可能会完全崩溃。
相反,为什么不简单地添加分页?确定一个页面大小(例如20),从查询中返回这些记录,以及显示所有数据所需的页面数。然后,您可以使用它来构建页面分页本身。因此,您从数据库返回的行永远不会超过20行,压力很小,站点运行很快。
现在的方式,您正在请求大量数据,并且如果您有1000条以上的记录,您要做的就是显示一条错误消息,要求用户再次提出请求。虽然您已经有了数据,但是除了计数以外,您没有将其用于其他任何用途。除非有课程,否则您要做的就是先运行一个计数,然后如果少于1000,则运行实际查询。
模型验证是在输入而非输出上运行的,我不建议您尝试更改MVC的工作方式,只是为了适应无论如何都不会发生的特定情况。
如果您想坚持自己的想法,请先运行计数查询,如果结果超过1000,则返回错误消息并将其显示给用户。您无需任何类型的自定义非模型验证就可以做到这一点。