Установка статуса HTTP в результатах контроллера ASP.NET MVC не отображает представление - PullRequest
6 голосов
/ 01 июля 2010

У меня есть собственный ActionResult для возврата определенных HTTP-ошибок, таких как NotFoundResult и ForbiddenResult, все они являются производными от ViewResult.

Я использую их для таких случаев, как действия с коротким замыканием с 404, если объект не был найден вбаза данных во время действия.

В этих результирующих объектах я устанавливаю HTTP Status на соответствующий номер.Когда я это делаю, представление о том, что эти ссылки на ViewResults не отображаются.Мне нужно оставить статус 200 ОК, чтобы мой вид был отображен.

Как установить соответствующий статус И отобразить вид в ASP.NET MVC 2.0?

1 Ответ

8 голосов
/ 01 июля 2010

У меня есть собственный ActionResult для возврата определенных HTTP-ошибок, таких как NotFoundResult и ForbiddenResult, все они происходят от ViewResult.

Позвольте мне предложить вам альтернативную обработку ошибок:

Начните с создания контроллера ошибок и соответствующих представлений:

public class ErrorController : Controller
{
    public ActionResult General()
    {
        return View();
    }

    public ActionResult HttpError404()
    {
        return View();
    }

    public ActionResult HttpError500()
    {
        return View();
    }
}

В Global.asax определите метод Application_Error:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    // TODO: Log the exception with your favorite logging framework

    Response.Clear();
    var httpException = exception as HttpException;

    var routeData = new RouteData();
    // Take the ErrorController
    routeData.Values.Add("controller", "error");

    if (httpException == null)
    {
        // Use the General action for any unhandled error
        routeData.Values.Add("action", "general");
    }
    else
    {
        switch (httpException.GetHttpCode())
        {
            case 404:
                routeData.Values.Add("action", "httpError404");
                break;
            case 500:
                routeData.Values.Add("action", "httpError500");
                break;
            default:
                routeData.Values.Add("action", "general");
                break;
        }
    }

    // Add the exception to route data so that the error controller 
    // could use it with RouteData.Values["error"]
    routeData.Values.Add("error", exception);

    Server.ClearError();
    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

Наконец выкиньте соответствующие исключения:

public class HomeController: Controller
{
    public ActionResult Index(int id)
    {
        var model = _repository.GetModel(id);
        if (model == null)
        {
            throw new HttpException(404, "Model not found with id = " + id);
        }
        return View(model);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...