2013-11-22 41 views
4

我正在使用MVC和Razor视图。在这个特定的视图中,我传递了一个类Bed的单个实例。 Bed有一个属性string Infection。现在在这个例子中,我在视图中定义了一个布尔值HasInfection,我在其他地方使用它来更改显示内容。这最初被宣布为NullReferenceException关闭时如果大括号

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; 
    } 
} 

我试过的每个组合&/& &/|/||我能想到没有成功。如果ModelnullModel.Infection == "",HasInfection应该是false

我在做什么错?

编辑

试图var HasInfection = Model != null && !string.IsNullOrWhiteSpace(Model.Infection);后(因为Infection可能是““),我仍然得到一个NullReferenceException。即使在View中出现异常,是否有可能在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

那一行,你得到空的异常? – cederlof

+0

@WillDean我已经尝试过在这一点上的一切组合,只是试图让一些工作。现在的编辑就是当前的代码。 @cederlof我在'var HasInfection = Model!= null &&!string.IsNullOrWhiteSpace(Model.Infection);'now'上得到异常。在编辑之前,它是在任何'if'语句的大括号之前。 –

+1

野猜这里...是BedModel数据库相关?如果它是一个IQueryable,那么有可能在你第一次使用它时调用“实际”查询......你是否尝试过在控制器中进行调试,以检查'_b'是否为空,并且'result'不为空? – Tallmaris

回答

1
HasInfection = Model != null && !string.IsNullOrWhitespace(Model.Infection); 
+3

IsNullOrWhiteSpace()会更好;) – Xaruth

+1

@Xaruth呵呵,在编辑之前我没有看到您的评论。干杯:) – cederlof

2

你应该能够做这样的事情:

var HasInfection = Model != null && !String.IsNullOrWhitespace(Model.Infection) 

我不认为我曾经通过一个空模型的Razor视图,但我不能看看为什么这不起作用。顺便说一下,你可以考虑让一个'NullBed'对象可以通过,它以任何你认为适合'缺少'床对象的方式行事 - 那么你不需要检查全部的空值这个地方,可以成为一个相当乏味的暴政。

编辑:现在你已经发布了控制器代码,它不会出现模型可以永远为空,所以这似乎是一个分心。无论出现什么问题,我怀疑你是在错误的地方寻找。

编辑2:哦,现在它再次从控制器代码中消失了。感觉像是系统地使用调试器可能比StackOverflow更有效......我会先通过传递一些固定的东西,并将其在控制器中的View调用中知道,然后计算出发生了什么,或许通过在您的视图。

如果您控制Bed类,您可以通过向Bed添加HasInfection属性来帮助自己和后继者,该属性可以执行任何必需的操作来返回该布尔值。您也可以通过将该BedStatus支票移入物业来同样改善控制器。这样做的好处不仅仅是风格化,它有助于调试这类问题,因为与床对象有关的东西会在代码中发生,而且在视图中留下的唯一东西(一个可怕的地方是调试)会简单得多。

+0

请看我编辑的回复。无论Model是null还是只是一个新的Bed(其中'Bed.Infection'为null),我仍然会在您的建议中看到此错误。 –

+1

@Xaruth Huh?您是否将我的帖子用作关于“var”关键字的咆哮机会? –

+0

@PhillipCopley - 你的编辑说“var HasInfection =!string.IsNullOrWhiteSpace(Model.Infection);”,这不是我写的,如果Model为null,肯定会失败。您不得使用null模型执行Model.Infection。 –

0

首先检查Modelnull与否,如果Modelnot null然后检查Model.Infection是不是空

试试这个:

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

请不要验证字符串是否为Trim且等于空!使用OOP! – Xaruth

+0

@Xaruth:感谢您的评论,我改变了它。 –

4

我有同样的问题。

当看第二条评论this问题时,我发现我的异常实际上是比NullReferenceException所指向的右括号更靠后的35条线(括号外)。

对于前:

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