C# 404异常时更新视图

C# 404异常时更新视图,c#,asp.net-mvc-4,httpcontext,C#,Asp.net Mvc 4,Httpcontext,在我的代码中,我使用log4net来记录异常和日志的结束,我想用正确的消息视图更新视图。在我的日志服务更新视图(实际上我的代码确实重定向)上,我的代码如下所示 private readonly HttpContextBase _httpContext; public void RedirectToError() { var httpException = _httpContext.Server.GetLastError(); if (httpException != null

在我的代码中,我使用log4net来记录异常和日志的结束,我想用正确的消息视图更新视图。在我的日志服务更新视图(实际上我的代码确实重定向)上,我的代码如下所示

private readonly HttpContextBase _httpContext;

public void RedirectToError()
{
    var httpException = _httpContext.Server.GetLastError();
    if (httpException != null && (_httpContext.Server.GetLastError() is HttpException))
    {
        _httpContext.Server.ClearError();
        _httpContext.Response.Redirect("/Error", false);
    }

}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)  
{
    if (filterContext.HttpContext.User.Identity.IsAuthenticated)
    {
        filterContext.Result =  new ViewResult {ViewName = "NoPermissions"};
    }
    else
    {
        // let the base implementation redirect the user
        base.HandleUnauthorizedRequest(filterContext);
    }
}
但是我实际上只想像authorized属性一样更新viewresult,我可以像这样更新viewresult

private readonly HttpContextBase _httpContext;

public void RedirectToError()
{
    var httpException = _httpContext.Server.GetLastError();
    if (httpException != null && (_httpContext.Server.GetLastError() is HttpException))
    {
        _httpContext.Server.ClearError();
        _httpContext.Response.Redirect("/Error", false);
    }

}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)  
{
    if (filterContext.HttpContext.User.Identity.IsAuthenticated)
    {
        filterContext.Result =  new ViewResult {ViewName = "NoPermissions"};
    }
    else
    {
        // let the base implementation redirect the user
        base.HandleUnauthorizedRequest(filterContext);
    }
}
但也不像filtercontext,我们如何用httpcontext更新viewresult? 如果httpcontext无法做到这一点,我们如何实现这一点


谢谢

不清楚第一块代码在哪里,第二块代码是否与您的问题有关(演示除外)。你的问题不清楚,所以这是一次冒险

将信息从应用程序的一部分传递到另一部分的一种方法是使用请求缓存

private readonly HttpContextBase _httpContext;

public void RedirectToError()
{
    var httpException = _httpContext.Server.GetLastError();
    if (httpException != null && (_httpContext.Server.GetLastError() is HttpException))
    {
        _httpContext.Server.ClearError();

        // Store the error in the request cache
        _httpContext.Items["LastError"] = httpException;
        _httpContext.Response.Redirect("/Error", false);
    }

}
然后在错误操作方法中,可以访问此值

public ActionResult Error()
{
    // Retrieve the error from the request cache
    Exception lastError = (Exception)this.HttpContext.Items["lastError"];

    // Pass the error message to the view
    ViewBag.Error = lastError.Message;

    return View();
}

通常,由于可能存在的安全隐患,您只需记录错误,而不向用户显示错误。

您可以在Global.asax中的Application\u error方法中捕获错误,并使用HttpContext重定向到页面

Protected void Application_Error(object sender, EventArgs e)
{
        MvcApplication app = (MvcApplication)sender;
        HttpContext context = app.Context;
       Exception exc = Server.GetLastError();
        if (exc.GetType() == typeof(HttpException))
            {
                errorCode = ((HttpException)exc).GetHttpCode();
            }
            else if (exc.GetType() == typeof(Exception))
            {
                errorCode = 500;
            }
            var routeData = new RouteData();
            routeData.Values["controller"] = "{Your Controller}";
            routeData.Values["statusDescription"] = "{Your Description}";
            routeData.Values["action"] = "http500";

            switch (errorCode)
            {
                case 404:
                      Server.ClearError();
                    routeData.Values["action"] = "Your action name";
                    break;
                case 403:

                    Server.ClearError();
                    routeData.Values["action"] = "Your action name";
                    break;
                case 405:

                    Server.ClearError();
                    routeData.Values["action"] = "Your action name";
                    break;
                case 500:

                    Server.ClearError();
                    routeData.Values["action"] = "Your action name";
                    break;
                default:

                    Server.ClearError();
                    routeData.Values["action"] = "Your action name";
                    break;
            }

            IController controller = new ErrorsController();
            controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));

            Server.ClearError();
    }

如果有帮助,请回复。:)

在显示错误页面之前,您似乎试图避开302,而只是返回一个带有错误的404

如果您使用返回ViewResult的控制器方法,那么您已经过了ASP.NET确定是否应返回404的点


.

出现了什么问题?您好,上面的代码没有问题,只是我需要更新查看结果,而无需重定向。就像第二个代码示例,对不起。我想说的是我只想更新viewresult。不要重定向。(Url不应更新)第二个代码示例与我的问题无关。这只是向您展示如何使用filterContext实现我的目标。谢谢