MVC3视图:巧妙地处理空模型

本文关键字:处理 模型 视图 MVC3 | 更新日期: 2023-09-27 18:26:11

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

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

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

但是人们是如何处理的呢?我当然看不到到处都是代码示例,视图中到处都是丑陋的null检查。这让我相信,大多数时候,控制器不应该返回空模型。但你怎么能更巧妙地执行这一点呢?

现在,一旦有人意外地导致控制器返回空模型,视图模型就会崩溃,看起来有故障。实际上,这是控制器的故障。视图甚至可能不会"捕捉"到问题,只有当模型的成员碰巧被使用时(当然,这是大多数时候),它才会这样做。

由于各种原因,某些视图可能希望处理null值。不过,我没想到这会是大多数人的情况。显然,这是在视图和控制器之间设置某种"契约"的问题。

我不喜欢我看到的选项:

  1. 每次使用模型时,请检查该模型是否为null非常蹩脚
  2. 一个big if语句用null模型包装整个视图检查想想浪费的代码房地产。哀叹
  3. 如果检查时在顶部投掷,则添加。不错,但看起来很傻。有点跛脚

我很想知道是否存在类似于这些选项来设置"无空"合同:

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

MVC3视图:巧妙地处理空模型

我在这里问了一个类似的问题。是否应该在MVC视图中防止null引用异常/索引越界异常?并得到了很好的回应。简而言之,最好在控制器中添加null检查,甚至在单元测试中添加,而不是在视图中添加。

这里有很多首选项,您可以做一些:

  1. 在数据层中抛出RecordNotFoundException(自定义异常),并使用全局异常筛选器捕获此异常
  2. 检查从存储库返回的null,并根据具体情况进行处理
  3. 装饰你的控制器,在不是CREATE方法的GET方法(或你认为可以的任何规则)上寻找一个空模型,并在OnActionExecuted中检查它

即使我的"CREATE"视图通常也会得到一个模型,即使是空的(尽管它们中通常有一个IEnumerable<SelectListItem>),所以它们应该总是有模型。

我在视图中检查null,有时在需要它的部分。

有时我也会在我的控制器中创建默认值,如果会有一个null值,这取决于你试图做什么以及什么是可以接受的。

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