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

时间:2019-02-08 12:46:32

标签: asp.net asp.net-mvc

我正在建立一个从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'-然后让它要么返回空的局部视图,要么调用用于获取列表的方法项,或返回其中包含错误消息的局部视图。似乎应该/应该是一个更简单或更聪明的解决方案。

同样,我一直在搜寻,但是正如我也提到的,我可能只是在看这个错误。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

现在的方式,您正在请求大量数据,并且如果您有1000条以上的记录,您要做的就是显示一条错误消息,要求用户再次提出请求。虽然您已经有了数据,但是除了计数以外,您没有将其用于其他任何用途。除非有课程,否则您要做的就是先运行一个计数,然后如果少于1000,则运行实际查询。

模型验证是在输入而非输出上运行的,我不建议您尝试更改MVC的工作方式,只是为了适应无论如何都不会发生的特定情况。

如果您想坚持自己的想法,请先运行计数查询,如果结果超过1000,则返回错误消息并将其显示给用户。您无需任何类型的自定义非模型验证就可以做到这一点。