【问题标题】:Display error even while Model.IsValid returns true即使 Model.IsValid 返回 true 也显示错误
【发布时间】:2019-02-08 12:46:32
【问题描述】:

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

现在我的问题来了 - 当它进入调用查询的 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” - 然后让它返回一个空的局部视图以及调用获取列表的方法item,或返回包含错误消息的局部视图。看起来应该/可能是一个更简单或更聪明的解决方案。

我再次四处寻找,但正如我也提到的,我可能只是看错了。

提前致谢。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

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

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

    您现在的方式是请求大量数据,如果您有超过 1000 条记录,您所做的只是显示一条错误消息,希望用户提出另一个请求。虽然您已经拥有数据,但除了计数之外,您没有将其用于任何其他用途。除非是一门课程,否则您所做的只是先运行计数,然后如果少于 1000,则运行实际查询。

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

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

    【讨论】:

    • 感谢@Andrei 的回答。我知道在一页上显示 1000 条记录并不理想 - 但在这种情况下,它是所要求的,它只是供内部使用的东西,可能每天调用一次。目前我只是运行计数,如果它小于 1000,我将运行实际查询。该数据库用于生产,它是一个 SQL2000 服务器 - 所以他们有点害怕运行到它的许多请求。我可能需要查看 1x1000 或 50x20(使用分页)哪个负载更大。我将看看另一种显示错误的方式。谢谢!
    【解决方案2】:

    您始终可以添加将显示在ValidationSummary 中的自定义错误消息

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2020-03-20
      相关资源
      最近更新 更多