<inp>5__2 为空 网络核心中的异常



我收到上面的错误。我将一个字段与另一个字段进行验证,基本上是在将数据输入文本框后,检查它是否存在于另一个文本框中。我设置了一个if条件,以确保如果数据不存在,那么它会返回到同一页进行另一次保存。但如果数据不存在,则返回错误<inp>5__2 was null.

以下是代码:

var inp = _ipacontext.Inpolicies.ToList().Where(x => x.PolicyNo == custView.Ppolicy).SingleOrDefault();
if (String.Equals(inp.PolicyNo, custView.Ppolicy))
{
custView.CID = Guid.NewGuid();
_context.Add(customerData);
await _context.SaveChangesAsync();
return RedirectToAction("Complete", "Home");
}
return Redirect("/Home/Create");

custview.policyNo是从表单中输入的字段,而inp.PolicyNo是正在验证的现有字段。

如果_ipacontext中没有满足Where中条件的元素,SingleOrDefault将返回默认值(即,对于像用户定义类这样的引用类型为null(。所以这行:

var inp = _ipacontext.Inpolicies.ToList().Where(x => x.PolicyNo == custView.Ppolicy).SingleOrDefault();

可能会留下一个空的inp变量。在下一行中,您将执行inp.PolicyNo,即在可能为null的实例上调用getter。

您可以使用null条件来安全访问您的财产:

if (String.Equals(inp?.PolicyNo, custView.Ppolicy)) //Note the ? after inp

这样,如果inpnull,则inp?.PolicyNo将返回null,并且您的if将转换为:if(String.Equals(null, custView.Ppolicy)),这是false。

作为旁注,String.Equals可以通过简单地使用==来代替。这样就不会让我想起我必须维护的遗留Java后端。

编辑

我只是注意到,你有效地做了两次相同的比较。如果没有匹配的元素,您的LINQ将返回null,所以您可以执行以下操作:

var inp = _ipacontext.Inpolicies.ToList().Where(x => x.PolicyNo == custView.Ppolicy).SingleOrDefault();
if (inp != null)
{
//Stuff
}

或者更清晰:

if (_ipacontext.Inpolicies.Any(x => x.PolicyNo == custView.Ppolicy))
{
//Stuff
}

最新更新