检查ASP.NET MVC控制器中的空值

时间:2010-06-01 22:11:26

标签: asp.net-mvc null controller

另一个意见问题:

检查MVC控制器中的空值是否合适(在您看来)。例如,如果你有一个编辑控制器根据id从db中获取记录,那么如果找不到该记录你该怎么办?我找到this article,但我不确定我喜欢那种方法。您是否只使用if语句检查并重定向到404页面?你用什么解决方案?

3 个答案:

答案 0 :(得分:2)

我不知道这是否是最佳做法,但我检查了if并重定向到“NotFound”视图,该视图声明“公司/客户/您请求的任何内容不存在或已被删除”。

这样做只是b / c我在设置网站骨架时遵循NerdDinner tutorial,这就是他们的做法。

答案 1 :(得分:0)

这就是我在博客中所做的:

public ActionResult DisplayPublication (int nr)
{
    if (!PublicationExists (nr))
        throw new (HttpException (404, ""));

    // ....

    return ...;
}

作为拇指的一般规则,如果请求的资源实际上不存在,则返回HTTP 404.绝对不返回200 OK以及有关缺失资源的消息。如果未找到,则应为404.如果您更改了网址的结构,请考虑301 Moved Permanently。

根据您正在开发的软件的类型和逻辑,您可能决定对这种情况做出不同的反应,这取决于您。

答案 2 :(得分:0)

我使用的方法类似于您链接的文章:如果视图模型为null,则返回404的动作过滤器。我将它与自定义动作调用程序(如this)结合起来,这样我就不必将过滤器属性放在所有内容上。

由于我提到过,如果你采取行动过滤路线,你可以采取其他几种行动。我有/过滤器将:

  1. 成功修改后自动重定向到“索引”视图。
  2. 如果ModelState无效,则重定向到同一页面。
  3. 如果引发安全异常,则重定向到拒绝访问的页面。
  4. 我正在考虑将这些重构为一个约定注册表,所以我可以有类似的东西:

    When.ModelIsNull.RedirectTo<SharedController>(c => c.NotFound());
    For("Edit").ModelStateIsInvalid.Redisplay();
    For("Edit").OnSuccess.RedirectTo("Index");
    On<SecurityException>().RedirectTo<SharedController>(c => c.AccessDenied());
    

    然后,如果我想改变特定行为的工作方式,我只需在一个地方更改它。例如,我可以重定向到View视图,而不是转到Index。

    For("Edit").OnSuccess.RedirectTo("View");
    

    我希望这会给你一些想法。

    编辑: Here是如何使用FubuMVC(我喜欢从中窃取想法)来完成类似的事情。