MVC3视图:使用精细处理空模型

时间:2012-03-01 15:16:56

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

我经常遇到项目中的视图抛出 null引用异常的情况。

@model Johnny.Application.TestModel
<div>@(Model.SomeText)</div>

如果模型 null ,则会引发错误。

但人们如何处理这个?我当然没有看到代码样本到处都是丑陋的空检查乱丢了视图中的代码。这让我相信大多数时候,控制器不应该返回null模型。但是你怎么能用更精细的方式来强制执行呢?

现在,只要有人意外导致控制器返回空模型,视图模型就会爆炸并且看起来有问题。实际上,这是控制器的错。并且该视图甚至可能“捕获”该问题,只有当模型的成员碰巧被使用时才会这样做(当然,大多数时候都是这样)。

由于各种原因,某些视图可能希望处理空值。不过,我不认为这是大多数情况。显然,这是在视图和控制器之间设置一些“契约”的问题。

我不喜欢我见过的选项:

  1. 每次使用时检查模型是否为空。 非常蹩脚
  2. 一个大if语句用null模型包装整个视图 校验。想想浪费的代码房地产。拉梅!
  3. 在顶部添加如果检查时抛出。不错,但看起来很傻。轻度跛脚。
  4. 我很想知道是否存在类似这些选项来设置“无效”合同:

    • 控制器方法的属性,如[NoNullModels]。我怀疑这是否存在,因为我不认为控制器知道它正在连接的视图。
    • 在视图中,像@ MVC3.HeyDontAllowNulls这样的指标或其他一些抛出异常的标准方法(如上面的选项3)

3 个答案:

答案 0 :(得分:2)

我在这里问了一个类似的问题Should one try to guard against null reference exceptions / index out of bounds exceptions in MVC views?并得到了很好的答复。简而言之,最好在控制器中添加空检查,甚至可以在单元测试中添加空检查。

答案 1 :(得分:0)

这里有很多偏好,你可以做的一些是:

  1. 在您的数据层中抛出RecordNotFoundException(自定义异常)并使用全局异常过滤器捕获此
  2. 检查从存储库返回的空值并按个案情况处理
  3. 装饰你的控制器,在GET方法上寻找一个空模型,这些方法不是CREATE方法(或你认为合适的任何规则),带有一个动作过滤器属性来检查OnActionExecuted中的这个
  4. 即使我的“CREATE”视图通常也会得到一个模型,即使它是空的(虽然它们中经常有一个IEnumerable&lt; SelectListItem&gt;),所以它们应该总是有模型传递给它们。

答案 2 :(得分:0)

我检查我的视图中的空值,有时是部分需要它的。

我有时会在我的控制器中创建默认值,如果有一个空值取决于你要做什么和可接受的。

例如,我有一个人订阅并设置通知的情况。如果他们没有通知,我的模型的子对象为空。我不想设置默认值,所以我在那里检查。在其他部分中,我只使用默认值。