在Async ActionResult

时间:2015-10-26 07:15:02

标签: c# asp.net asp.net-mvc-5 async-await

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

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

    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,这是null,会引发异常。

除了参数和字段不同之外,两个语句看起来都是相同的。

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

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

?!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);

1 个答案:

答案 0 :(得分:0)

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

if (!(bool) closed)

是罪魁祸首,closed是一个可以自欺欺人的布尔。我将该行更改为

if (!closed.GetValueOrDefault())

并且异常消失了。

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