在异步操作结果中检查空值后无效操作异常

本文关键字:无效 操作 异常 空值 检查 异步操作 结果 | 更新日期: 2023-09-27 18:19:10

我有一个奇怪的问题,尽管条件false,但 IF 语句中的代码仍在运行。

我的控制器中有以下代码:

    public async Task<ActionResult> Index(string q, string room)
        ...
        // Set up collection of tickets, etc.
        ...
        // Filter by Room
        if (!string.IsNullOrWhiteSpace(room))
        {
            itTickets = itTickets.Where(x => x.Room.ToLower().Contains(room.ToLower()));
        }
        // Filter by Summary/Description
        if (!string.IsNullOrWhiteSpace(q))
        {
            itTickets = itTickets.Where(x => x.Summary.ToLower().Contains(q.ToLower()));
        }
        ...
        return View(await itTitckets.ToListAsync());
        ...
    }

当我尝试在站点/ItTickets/上没有任何参数的情况下访问控制器时,我收到以下错误:

System.InvalidOperationException: Nullable object must have a value.

此错误在第二个 if 语句中命

单步执行代码:

  • 我已经验证了roomq都是null.
  • 第一个if语句不会进入大括号内。
  • 第二个 if 语句确实进入大括号,并尝试访问 q ,这是空的,这将引发异常。

除了参数和字段不同之外,这两个语句似乎相同。

itTickets.RoomitTickets.Summary都属于 NVARCHAR(50) 型。

当我检查即时窗口时,我可以验证 IF 语句中的条件是否为 false:

?!string.IsNullOrWhiteSpace(q)
false

然而,里面的代码还是会执行。这是怎么回事?

更新:我注意到,如果我使该方法非异步,它可以正常工作。奇怪!

更新 2 根据要求提供更完整的代码版本:

    public async Task<ActionResult> Index(string sortOrder, string q, string room, string submitter,
                                          bool? closed,
                                          int? page)
    {
        var itTickets = _content.ItTickets.Include(i => i.ClosingUser).Include(i => i.Submitter);
        // Filter by Submitter
        if (!string.IsNullOrWhiteSpace(submitter))
        {
            itTickets =
                itTickets.Where(
                    x => x.Submitter.LogonName.ToLower().Contains(submitter.ToLower()));
        }
        // Filter by Room
        if (!string.IsNullOrWhiteSpace(room))
        {
            itTickets = itTickets.Where(x => x.Room.ToLower().Contains(room.ToLower()));
        }
        // Filter by Summary/Description
        if (!string.IsNullOrWhiteSpace(q))
        {
            itTickets =
                itTickets.Where(x => x.Summary.ToLower().Contains(q) || x.Description.ToLower().Contains(q));
        }
        // Include closed tickets?
        if (!(bool) closed)
        {
            itTickets = itTickets.Where(x => x.Closed == null);
        }
        var results = await itTickets.OrderBy(x => x.Submitted).ToListAsync();
        return View(results);

在异步操作结果中检查空值后无效操作异常

Lasse和Klaudiusz都帮助我找到了答案 - 异常是由与输出中显示的行不同的行生成的,并由Visual Studio识别。

if (!(bool) closed)

是罪魁祸首,closed是一个可为空的布尔值。我把那行改成了

if (!closed.GetValueOrDefault())

例外消失了。

我希望我能将评论标记为答案。感谢您的帮助!