【发布时间】:2012-03-01 15:16:56
【问题描述】:
我经常遇到项目中的视图抛出空引用异常的情况。
@model Johnny.Application.TestModel
<div>@(Model.SomeText)</div>
如果 Model 为 null,则会引发错误。
但是人们是如何处理这个问题的呢?我当然不会在任何地方看到代码示例,其中丑陋的空检查在视图中乱扔代码。这让我相信大多数时候,控制器不应该返回空模型。但是,您如何才能更巧妙地执行此操作呢?
现在,一旦有人不小心导致控制器返回 null 模型,视图模型就会崩溃并看起来有问题。实际上,这是控制器的错。视图甚至可能无法“抓住”问题,只有在模型的成员碰巧被使用时才会这样做(当然,这是大多数时候)。
由于各种原因,某些视图可能想要处理空值。不过,我不希望这是大多数情况。显然这是在视图和控制器之间设置一些“合同”的问题。
我不喜欢我见过的选项:
- 每次使用时检查模型是否为空。 很蹩脚!
- 一个大 if 语句用一个空模型包裹整个视图 查看。想想浪费的代码空间。跛脚!
- 在顶部添加 if 检查并带有 throw 。不坏,但看起来很傻。有点跛脚。
我很想知道是否存在类似的选项来设置“无空值”合同:
- 控制器方法上的属性,如 [NoNullModels]。我怀疑这是否存在,因为我认为控制器不知道它连接到什么视图。
- 在视图中,@MVC3.HeyDontAllowNulls 之类的指示器或其他引发异常的标准方式(如上面的选项 3)
【问题讨论】:
-
为什么还要返回一个空模型?
-
你试过
@Html.DisplayFor(m => m.SomeText) -
鉴于将模型传递给视图是控制器的工作,不应该处理空模型而不是视图吗?由于控制器不遵守协议而使视图复杂化似乎不是正确的方法。
-
关于代码样例话题,网上99%的代码样例都没有异常处理和输入验证。部分是因为懒惰,部分是因为它会混淆代码示例所说明的点。
-
我还会考虑使用某种全局异常日志记录,例如 ELMAH,并确保您有一个友好的错误页面,以便在出现问题时向用户显示。然后,您可以密切关注 ELMAH 日志并修复代码未预料到的严重错误。
标签: c# asp.net asp.net-mvc-3 razor