首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭if支撑时的NullReferenceException

关闭if支撑时的NullReferenceException
EN

Stack Overflow用户
提问于 2013-11-22 14:08:59
回答 4查看 2K关注 0票数 5

我使用MVC与Razor视图。在这个特定的视图中,我将传递类Bed的一个实例。Bed有一个属性string Infection。现在,在这个实例中,我在视图中定义了一个布尔HasInfection,用于更改显示的内容。这最初被宣布为

代码语言:javascript
复制
var HasInfection = (Model.Infection.Trim() != "";

并按预期工作。但是,现在有一个用例,其中Bed可能为null。下面是第一个代码块:

代码语言:javascript
复制
@{
    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。

代码语言:javascript
复制
if (Model.Infection == null)
{
    HasInfection = false;
}
else
{
    if (Model.Infection != "")
    {
        HasInfection = true;
    }
    else
    {
        HasInfection = false;
    }
}

我尝试了我所能想到的每一个组合,但都没有成功。如果ModelnullModel.Infection == "",那么HasInfection应该是false

我做错了什么?

编辑

在尝试var HasInfection = Model != null && !string.IsNullOrWhiteSpace(Model.Infection);之后(因为Infection可能是“"),我仍然会得到一个NullReferenceException。即使异常在视图中,是否有可能出现在Controller中?

代码语言:javascript
复制
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);
}
EN

回答 4

Stack Overflow用户

发布于 2014-06-12 11:58:17

我也有同样的问题。

当查看this问题中的第二条评论时,我发现我的例外实际上是在前面35行(括号外),而不是NullReferenceException指向的结束括号。

前任:

代码语言:javascript
复制
    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
票数 5
EN

Stack Overflow用户

发布于 2013-11-22 14:14:32

你应该能做这样的事:

代码语言:javascript
复制
var HasInfection = Model != null && !String.IsNullOrWhitespace(Model.Infection)

我想我从来没有把一个空模型传递给Razor视图,但是我不明白为什么这个模型不能工作。

顺便说一句,你可以考虑拥有一个你可以传递的“NullBed”对象,无论你认为“失踪”床上的对象是什么,它的行为方式都是正确的--那么你就不需要到处检查空白点,这可能会成为一个相当令人厌烦的暴政。

编辑:现在您已经发布了控制器代码,看起来模型无论如何都不可能是空的,所以这看起来像是分散了注意力。我怀疑你找错地方了不管是什么问题。

Edit2:哦,现在它又从控制器代码中消失了。觉得系统地使用调试器可能比StackOverflow更有效.我首先传递一些固定的内容,并将其传递到控制器中的view调用中,然后计算出正在发生的事情,也许是通过在您的视图中显示东西。

如果您控制了Bed类,您可以通过在床上添加一个HasInfection属性来帮助自己和后继者,该属性可以执行返回该布尔值所需的任何操作。您也可以通过将BedStatus签入属性来改进控制器。这样做的好处不仅仅是风格上的,它还将帮助调试这类问题,因为与床对象相关的东西将发生在该代码中,而视图中只剩下的东西(一个可怕的调试位置)会简单得多。

票数 2
EN

Stack Overflow用户

发布于 2013-11-22 14:11:45

代码语言:javascript
复制
HasInfection = Model != null && !string.IsNullOrWhitespace(Model.Infection);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20146863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档