Asp.net mvc 3 是否应该在MVC视图中防止空引用异常/索引越界异常?

Asp.net mvc 3 是否应该在MVC视图中防止空引用异常/索引越界异常?,asp.net-mvc-3,asp.net-mvc-2,razor,Asp.net Mvc 3,Asp.net Mvc 2,Razor,我想在被接受的答案上发表一条评论,“现在还没有放弃代码吗?那么你打算测试什么?”指出,在我看来,只要你添加一个 <% if (Model.Thing == "abc") {} %> 在你看来,存在爆炸的可能性,这种可能性应该加以防范 关于我链接到的问题,我可以看到一个论点,即人们应该防止代码背后出现空引用异常的可能性,而不是用空检查来乱丢自己的观点,但是部分观点的情况又如何呢?在可能呈现局部视图的多个位置(而不是视图本身的一个位置)添加多个null检查是否真的更好?IMO,如果您希

我想在被接受的答案上发表一条评论,“现在还没有放弃代码吗?那么你打算测试什么?”指出,在我看来,只要你添加一个

<% if (Model.Thing == "abc") {} %>
在你看来,存在爆炸的可能性,这种可能性应该加以防范


关于我链接到的问题,我可以看到一个论点,即人们应该防止代码背后出现空引用异常的可能性,而不是用空检查来乱丢自己的观点,但是部分观点的情况又如何呢?在可能呈现局部视图的多个位置(而不是视图本身的一个位置)添加多个null检查是否真的更好?

IMO,如果您希望值为null、oob等,则只应在视图中防止null、索引oob等


理想情况下,您应该为您的操作方法进行单元测试,以确保某些模型值不为null/在边界内/等等。当某个值可能为null时,您可能有充分的理由在视图中进行null检查。否则,它就是无用的代码

试着摆脱思维方式背后的Webforms代码。模型数据的空检查应该在控制器中处理。视图应该包含这种检查的最小(或没有)逻辑

public ActionResult YourAction(YourModel ym)
{
    if (ym.Thing != null)
        return View(ym);
    else
        return View();
}

或者你必须对数据进行的任何类型的检查。这样,在您看来,它就不会充斥着检查模型数据。这都是MVC设计中关注点分离的一部分。

如果没有法律条件规定模型或模型属性应该为空,那么我会说您的单元测试,而不是视图应该强制执行这一点。如果存在模型可以为null或包含null属性的情况,那么请务必检查此项(如果检查为null),以便您可以调整显示。您仍然需要防止业务逻辑,而不是显示逻辑(其中一些可能与业务规则有关)泄漏到您的视图中。

这不会编译,我想他是在问是否应该在使用
模型的属性之前检查它是否为空。@tvanfosson谢谢,修复了。此外,该逻辑可以很容易地放在控制器代码中。我只是认为观点不应该如此关注这一点。我从MVC开始,如果它咬了我的屁股,我不知道Webforms,但你的建议仍然有效。谢谢@Shark-我同意,一般来说,模型不应该为空。单元测试应该保证这一点,我们真的不应该在视图中关注它。不过,您的更新并没有说明这一点。第二次返回将导致视图中出现空模型,并将强制视图考虑这种可能性。@tvanfosson我同意,我发布的操作方法很可能不符合用户想要检查的内容。它只是用来展示一个与视图相反的控制器中的条件检查示例。感谢您的反馈,@olivehour。我认为接受你的指导方针需要改变习惯,这将是有益的。在视图中出现空条件(oob等)的地方添加一个防范措施是非常诱人和容易的,但是我在这里得到的答案是非常一致的,并且是合理的。一旦你开始编写单元测试,这些习惯就会加强。你会有单元测试,当某个部分是/不是空的/oob等情况下断言场景。如果你曾经发现某个东西是空的,而你并不期望它是空的,那么你就错过了一个单元测试。我已经在很大程度上关注单元测试了。我会确定,并将这种类型的检查添加到我的曲目中。
public ActionResult YourAction(YourModel ym)
{
    if (ym.Thing != null)
        return View(ym);
    else
        return View();
}