关闭if大括号的NullReferenceException

时间:2013-11-22 14:08:59

标签: c# asp.net-mvc razor nullreferenceexception

我正在使用带有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; / | / ||的每个组合我可以想到没有成功。如果ModelnullModel.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);
}

4 个答案:

答案 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)

如果Modelnull,请先检查Modelnot null,然后检查Model.Infection是否为空

试试这个:

if(Model != null && Model.Infection != null && Model.Infection.Trim() != "")
{
        HasInfection = true;
}