在ASP.NET MVC中我应该重定向到错误页面还是只返回错误视图?

时间:2011-11-18 18:08:22

标签: c# asp.net asp.net-mvc-3 error-handling

当我问这个问题时,我主要是考虑不好的参数。参数where:

  • int< = 0
  • string为空或空格
  • 模型绑定对象缺少关键属性
  • id not found errors ”(将“有效”整数id传递给操作,但没有相应的数据库记录)

以下是我正在谈论的两个错误处理方案:

public ActionResult GoToError(int value, string name)
{
    if (value <= 0 || string.IsNullOrWhiteSpace(name))
    {
        // Parameter(s) not meeting basic conditions
        TempData["ErrorMessage"] = "Invalid parameters";
        return RedirectToAction("Index", "Error");
    }

    return View();
}

public ActionResult ReturnView(int value, string name)
{
    if (value <= 0 || string.IsNullOrWhiteSpace(name))
    {
        // Parameter(s) not meeting basic conditions
        ViewData["ErrorMessage"] = "Invalid parameters";
        return View("Error");
    }

    return View();
}

3 个答案:

答案 0 :(得分:1)

有不同的情况需要区别对待:

  • 对于完全意外错误,您没有预料到,我建议让异常冒出来并在Controller.OnException(...) method和/或asp.net custom error pages
  • 处理它
  • 对于预期的常见错误,例如用户提供错误输入,正确返回视图并显示通过ModelState.Errors传递的错误
  • 如果要通过AJAX / Javascript /作为服务 进行操作,则需要协调您发回的内容。它可以是自定义JSON对象或特定视图。

根据您发布的内容,我无法对他们“预期”或“未预料到”的天气进行分类。主要问题是,这些调用的客户端如何处理它们?

答案 1 :(得分:0)

在RESTFul应用程序中,您应该返回视图并设置相应的HTTP状态代码(401,403,404,500,...)。重定向时,这意味着状态代码200并返回错误页面的状态代码200没有意义。这是我用来处理错误的technique。当您可以订阅不同的状态代码时,这也非常适合AJAX。例如,假设您有一个经过身份验证的站点,其中登录的用户可以执行AJAX请求。在某些不活动之后,如果您的服务器没有返回正确的状态代码(在这种情况下为401),则会话可能会过期,并且当他们需要执行某些AJAX请求时,客户端脚本将很难理解和处理该方案。

答案 2 :(得分:0)

在ASP.NET中正确地做错误只是噩梦般的困难。

如果您遵循网络的目的:

您应该返回任何无法从错误中恢复的错误结果,例如400错误请求,404资源未找到等。这包括4xx范围内的大多数错误。

对于将导致500错误的未处理异常的应用程序错误,正确的解决方案是向错误页面发出302重定向,以正确返回500状态代码。

正如@Darin Dimitrov所说,在RESTful应用程序中,你永远不应该发出任何应该总能最终返回结果的重定向。