在异步操作结果中检查空值后无效操作异常
本文关键字:无效 操作 异常 空值 检查 异步操作 结果 | 更新日期: 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 语句中命中。
单步执行代码:
- 我已经验证了
room
和q
都是null
. - 第一个
if
语句不会进入大括号内。 - 第二个
if
语句确实进入大括号,并尝试访问q
,这是空的,这将引发异常。
除了参数和字段不同之外,这两个语句似乎相同。
itTickets.Room
和itTickets.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())
例外消失了。
我希望我能将评论标记为答案。感谢您的帮助!