什么是保护ASP.NET MVC中的NullReferenceExceptions的正确模式

时间:2010-11-23 22:42:03

标签: asp.net-mvc asp.net-mvc-3 razor nullreferenceexception renderpartial

更新 问题是语法问题。 @awrigley显示了在Razor中写这个的正确方法。

以下作品:

@if(Model.Thing.Prop != null)
{
    Html.RenderPartial("SomePartialView", Model.Thing.Prop);
}

您需要将给定Foo的前1 Bar的详细信息显示为HTML表格。如果Foo为空,如何隐藏空表或显示“未找到”消息?

例如。我在下一行收到NullReferenceException,因为Model.Thing.Propnull;

@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);} 

故意为null,我的Repository返回null而不是空Foo。但是,除了Model.Thing.Prop之外,我还不想调用Html.RenderPartial

更新
我试过以下没有运气:

@if(Model.Thing.Prop != null)
{
    @{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
}

这导致Visual Studio告诉我它在第1行第1列预期;,而且;是第1行第1列的无效表达式(我猜这是到期的)到MVC3的预发布状态),如果我在浏览器中点击页面,我得到

  

CS1501:方法'Write'没有重载需要0个参数

突出显示@Html.RenderPartial行。

我也试过

@if(Model.Thing.Prop != null)
{
    <text>
    @{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
    </text>
}

但这导致我的部分视图中的NullReferenceException,这似乎不对。 Model.Thing绝对有效BarModel.Thing.Prop绝对是null Foo

2 个答案:

答案 0 :(得分:2)

我认为你不想使用......

@if (Model.Thing.Prop != null)
{Html.RenderPartial("SomePartialView", Model.Thing.Prop);} 

...因为你还想渲染局部视图的一部分吗?

哦,不。已正确阅读您的帖子。

我不知道为什么上面的代码不适合你。

编辑:

请记住,在Razor中,@可以使用两种方式:

  1. 执行陈述:

    @ {     我的声明; }

  2. 评估HtmlHelper,类方法,属性或变量,它返回某种形式或其他形式的字符串(例如,HtmlString,MvcHtmlString或string)。例如:

    @ MyClass.MyStringProperty

  3. 请注意,在案例2中,不需要终止半冒号。

    1和2表示如果你有一个htmlhelper返回一个字符串以外的东西(例如,void),那么你必须按如下方式调用它:

    @{Html.MyHelperThatReturnsVoid;}
    

    使用返回字符串或HtmlString或MvcHtmlString的HtmlHelper,您可以简单地写:

    @Html.MyHelperThatReturnsAString
    

    有关详细信息,请参阅我提出的问题的接受的答案

    Custom HtmlHelper that returns void problem


答案 1 :(得分:0)

这可能是MVC3的变化,也可能是奇怪的。

MVC2行为:
如果Model.Thing为null,那么它是一个空引用异常 如果Model.Thing存在且Thing.Prop为null,那么您将向模型传递空引用。当您将null ref传递给模型时,父模型(此处的Model)将作为模型传递给期望类型为Prop的“SomePartialView”(除非Model和Prop是相同的类型)。

考虑到你得到null ref,我将假设Model.Thing为null。在这种情况下,您唯一的解决方案是@if语句。将null传递给模型ref根本不起作用,我已经在行为上撕掉了一些头发。

同样,这是MVC2行为,如果这对MVC3有所改变,你真的可以通过一个空模型,真棒!