6

我有一个 Razor 视图,开头如下:

@using My.Models
@model MySpecificModel
@{
    ViewBag.Title = "My Title";  
    // NullReferenceException here:
    string dateUtc =  
        (Model == null ? DateTime.UtcNow.ToShortDateString() :
                         Model.Date.ToShortDateString());

我看不出最后一行出现 NullReferenceException 的原因(注意:“= ?:”东西在我的源代码中的一行。它的格式适合这里。)

然后我删除/赋值的声明,dateUtc并且 NullReferenceException 向上移动到 ViewBag.Title 行:

@using My.Models
@model MySpecificModel
@{
    ViewBag.Title = "My Title";  // NullReferenceException here:

这怎么可能发生? ViewBag当然不是空的。

注意 1Model :只有在为空时才会发生这种情况。

注意 2:MySpecificModel.Date 是 DateTime 类型,因此永远不能为空。

4

3 回答 3

4

ViewBag.Title 上的 NullReferenceException 可以指示错误确实在附近的行上。在此示例中,第 1 行引发了错误,但真正的错误是第 3 行中的 null Model.Invoice。

<h2>@ViewBag.Title</h2>
<div class="pull-right">
    <button onclick="addInvoice('@Model.Invoice.InvoiceId');">Add Invoice</button>
</div>

此外,ASP.NET MVC Razor 不像 C# 那样处理三元语句中的空值。

//Ternaries can error in Razor if Model is null
string date = (Model == null ? DateTime.Now : Model.Date);

//Change to
string date = null;
if (Model == null)
    date = DateTime.Now;
else
    date = Model.Date;
于 2014-11-07T18:35:15.907 回答
3

如果您没有将任何模型传递给视图并且仍然将视图绑定到模型,您将得到一个空异常,例如:

@model MySpecificModel 

当您没有将此类模型从控制器传递给视图时。

于 2013-04-29T06:42:15.643 回答
3

您提供了一个空的默认模型,它什么都不做。它将只是这样模型不为空。拥有 IsEmpty 属性会有所帮助。更好的是,如果它可以应用于您的案例,则可以使用具有默认值的模型。重要的是模型永远不会为空

于 2013-04-30T06:39:17.110 回答