在ASP.我应该重定向到错误页面还是简单地返回一个错误视图

本文关键字:错误 返回 视图 一个 简单 重定向 我应该 ASP | 更新日期: 2023-09-27 18:15:18

当我问这个问题时,我主要考虑的是坏参数。参数所在:

  • 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();
}

在ASP.我应该重定向到错误页面还是简单地返回一个错误视图

有不同的场景,需要不同的处理:

  • 对于完全意外错误你不期望,我建议让异常冒泡和处理它在Controller.OnException(...)方法和/或asp.net自定义错误页面
  • 对于预期的常见的错误,例如用户提供了错误的输入,返回通过ModelState传递的视图和显示错误是适当的。错误
  • 如果动作打算通过AJAX/Javascript/作为服务调用,你需要协调你发回的内容。它可以是自定义JSON对象或特定视图。

根据你发布的内容,我无法区分它们是"预期的"还是"未预期的"。主要的问题是,这些调用的客户端期望如何处理它们?

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

正确处理ASP中的错误。. NET简直就是噩梦般的难。

如果你遵循网络的本意:

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

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

正如@Darin Dimitrov所说,在RESTful应用程序中,您不应该为任何东西发出重定向,它应该始终明确地返回结果。