2015-03-10 3 views
4

В моем коде я использую log4net для регистрации исключения и окончания ведения журнала. Я хочу обновить представление с надлежащим представлением сообщений. на мой взгляд, обновление службы журнала (на самом деле мой код делает перенаправление) мой код выглядит следующим образомОбновить вид, когда исключение 404

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

} 

, но я на самом деле хочет, чтобы обновить ViewResult только как уполномоченный атрибут я смог обновить ViewResult как этот

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, как мы можем обновить viewresult с помощью httpcontext? если нет способа сделать это с помощью httpcontext, как мы можем достичь этого?

Благодаря

+0

В чем проблема? –

+0

Привет, нет проблем с приведенным выше кодом. Мне нужно обновить результат просмотра без перенаправления. Как и во втором примере кода. – Gayan

ответ

1

Неясно, где первый блок кода и является ли даже связывающее второй блок на ваш вопрос (кроме демо). Ваш вопрос непонятен, так что это выстрел в темноте.

Одним из способов передачи информации из одной части приложения в другую является использование кэширования запросов.

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

Как правило, вы бы просто зарегистрировать ошибку и не показать его пользователю из-за последствий безопасности, которые могут иметь.

+0

Прошу прощения. Я хочу сказать, что я хотел только обновить viewresult. Не перенаправлять. (Url не должен обновлять), второй пример кода, не связанный с моим вопросом. Это только показать вам, как достичь моей цели с помощью filterContext. благодаря – Gayan

0

Вы можете поймать ошибку в методе Application_Error в Global.asax и использовать 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(); 
    } 

Пожалуйста, ответьте, если это поможет. :)

0

Похоже, вы пытаетесь избежать 302 до отображения страницы ошибок и просто возвращает 404 с ошибкой ...

Если вы получаете в контроллере метод, который возвращая ViewResult то вы уже прошли точку, в которой ASP.NET определил, что он должен вернуть 404 или нет.

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