我正在使用带有Razor视图的MVC。在此特定视图中,我传递了类Bed
的单个实例。 Bed
有一个属性string Infection
。现在在这个例子中,我在视图中定义了一个布尔HasInfection
,我在其他地方使用它来更改显示的内容。这最初被宣布为
var HasInfection = (Model.Infection.Trim() != "";
并按预期工作。但是,现在有一个用例Bed
可能为空。这是第一个代码块:
@{
ViewBag.Title = "Edit";
var HasInfection = false;
if (Model != null)
{
HasInfection = Model.Infection.Trim() != "";
} // I get a NRE on this line whenever Model is null
}
我甚至尝试过复杂的嵌套if-else解决方案,我仍然在if
的右大括号上获得NRE。
if (Model.Infection == null)
{
HasInfection = false;
}
else
{
if (Model.Infection != "")
{
HasInfection = true;
}
else
{
HasInfection = false;
}
}
我尝试了& /& / amp; / | / ||的每个组合我可以想到没有成功。如果Model
为null
或Model.Infection == ""
,则HasInfection
应为false
。
我做错了什么?
修改
尝试var HasInfection = Model != null && !string.IsNullOrWhiteSpace(Model.Infection);
后(因为Infection
可能是“”),我仍然会收到NullReferenceException。即使异常在视图中,问题是否可能在Controller中?
public ActionResult EditReservation(int Facility, string Room, string Bed)
{
var BedModel = New Bed();
List<Bed> _b = BedModel.GetBed(Facility, Room, Bed);
Bed result = _b.Where(bed => bed.BedStatus == "R" || bed.BedStatus == "A").FirstOrDefault();
return View("Edit", result);
}
答案 0 :(得分:4)
我遇到了同样的问题。
在查看this问题中的第二条评论时,我发现我的异常实际上是35行(在括号外),而不是NullReferenceException指向的结束括号。
例如:
if(Model.Infection != null)
{
<p>Some Html</p>
} //given NullReferenceException location
<p>Model.Infection</p> //Actual cause of NullReferenceException since
//here Model.Infection can be null
答案 1 :(得分:2)
你应该可以这样做:
var HasInfection = Model != null && !String.IsNullOrWhitespace(Model.Infection)
我无法想象我曾经将一个空模型传递给Razor视图,但我不明白为什么这不会起作用。
顺便说一下,你可以考虑使用“NullBed”。你可以通过的对象,它以你认为适合“失踪”的方式行事。床对象 - 那么你不需要在整个地方检查空值,这可能会成为一个非常令人讨厌的暴政。
编辑:现在您已经发布了控制器代码,但是看起来模型无论如何都不能为空,所以这似乎是一种分心。我怀疑你在错误的地方找不到任何问题。
Edit2:哦,现在又从控制器代码中消失了。感觉像系统地使用调试器一样可能比StackOverflow更有效......我首先要传递固定的东西,然后在控制器的View调用中知道,然后计算出发生了什么,也许是在您的视图中显示内容。
如果您掌控Bed类,您可以通过向Bed添加HasInfection属性来帮助自己和您的继承者,它可以执行返回该布尔值所需的任何操作。您可以通过将BedStatus检查移动到属性来类似地改进控制器。这样做的好处不仅仅是风格,它有助于调试这类问题,因为与床对象相关的东西会在该代码中发生,并且视图中剩下的唯一东西(一个可怕的调试地点)会更简单。
答案 2 :(得分:1)
HasInfection = Model != null && !string.IsNullOrWhitespace(Model.Infection);
答案 3 :(得分:0)
如果Model
为null
,请先检查Model
是not null
,然后检查Model.Infection
是否为空
试试这个:
if(Model != null && Model.Infection != null && Model.Infection.Trim() != "")
{
HasInfection = true;
}