asp.net-mvc – 在ASP.NET MVC控制器结果中设置HTTP状态不呈现视图

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 在ASP.NET MVC控制器结果中设置HTTP状态不呈现视图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
我有一个自定义ActionResult用于返回某些HTTP错误,如NotFoundResult和ForbiddenResult,它们都派生自ViewResult.

如果在操作过程中没有在数据库中找到实体,我会将它们用于404的短路操作.

在这些结果对象中,我将HTTP状态设置为适当的数字.当我这样做时,这些ViewResults引用不会呈现的视图.我必须将状态保留为200 OK才能呈现我的视图.

如何在ASP.NET MVC 2.0中设置适当的状态并呈现视图?

解决方法

I have a custom ActionResult for
returning certain HTTP Errors,like
NotFoundResult and ForbiddenResult,
they all derive from 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);
    }
}

猜你在找的asp.Net相关文章