404异常时更新视图

本文关键字:新视图 更新 异常 | 更新日期: 2024-11-07 09:20:19

在我的代码上,我正在使用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做到这一点,我们如何实现这一目标?

谢谢

404异常时更新视图

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

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

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_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 的时间点。

对于 MVC 中的 404,我会使用这个答案。