【问题标题】:Update view when 404 exception404 异常时更新视图
【发布时间】:2015-05-11 16:26:11
【问题描述】:

在我的代码中,我使用 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);
    }
}

但也不像filtercontext,我们如何用httpcontext更新viewresult? 如果没有办法用 httpcontext 做到这一点,我们怎么能做到这一点?

谢谢

【问题讨论】:

  • 问题来了?
  • 您好,上面的代码没有问题,我只需要更新视图结果而不重定向。就像第二个代码示例一样。

标签: c# asp.net-mvc-4 httpcontext


【解决方案1】:

看起来您正在尝试在显示错误页面之前避免 302,而只是返回带有错误的 404...

如果你得到一个返回 ViewResult 的控制器方法,那么你已经过了 ASP.NET 确定它是否应该返回 404 的点。

For 404's in MVC I would use this answer.

【讨论】:

    【解决方案2】:

    您可以在 Global.asax 中的 Application_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();
        }
    

    如果有帮助请回复。 :)

    【讨论】:

      【解决方案3】:

      目前尚不清楚第一个代码块在哪里以及第二个代码块是否与您的问题相关(除了演示)。你的问题不清楚,所以这是在黑暗中拍摄。

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

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

      通常情况下,您只需要记录错误而不向用户显示,因为可能会产生安全隐患。

      【讨论】:

      • 对不起。我的意思是我只想更新视图结果。不重定向。 (网址不应更新)与我的问题无关的第二个代码示例。这只是向您展示如何使用 filterContext 实现我的目标。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2018-11-25
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多