我有一个奇怪的问题,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语句中 。
单步执行代码:
room
和q
均为null
。if
语句不会进入大括号内。if
语句执行输入大括号,并尝试访问q
,这是null,会引发异常。除了参数和字段不同之外,两个语句看起来都是相同的。
itTickets.Room
和itTickets.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);
答案 0 :(得分:0)
Lasse和Klaudiusz都帮助我找到答案 - 异常是从与输出中显示的行不同的行生成的,并由Visual Studio识别。
if (!(bool) closed)
是罪魁祸首,closed
是一个可以自欺欺人的布尔。我将该行更改为
if (!closed.GetValueOrDefault())
并且异常消失了。
我希望我能将评论标记为答案。谢谢你的帮助!