2013-07-24 2 views
1

Снова есть несколько статей, в которых говорится о доступе к данным после перенаправления. но не служит моей цели.Как получить доступ к данным после перенаправления

У меня есть диспетчер ошибок, который имеет метод действия индекса и индекс индекса ошибки.

Если в приложении есть какие-либо ошибки, это будет зависеть от события Application_Error.

внутри Application_Error случае я вошел ошибку и перенаправляется на страницу Error Index, как это -

protected new void Application_Error(object sender, EventArgs e) 
{ 
    Exception error = Server.GetLastError(); 
    log.error(error.Message); 
    HttpContext.Current.Response.Redirect("~/Error/Index"); 
} 

Теперь в индексном ошибок, я хотел бы, чтобы отобразить сообщение об ошибке. Что мне следует делать в событии Application_Error, доступ к которому можно получить по представлению Index Index?

Обновлено: Я не хочу использовать сеанс, поскольку объект сеанса может быть недоступен в событии Application_Error. это зависит от того, когда произошла ошибка.

+0

@PKKG, yep на данный момент используя TempData .... принял ваш ответ, поскольку он содержит более подробную информацию. Спасибо –

ответ

2

подход - 1

По моим сведениям вы можете использовать TempData хранить отправленные данные. Это похоже на класс DataReader, после его чтения данные будут потеряны. Так что сохраненные данные в TempData станут нулевыми.

var Value = TempData["keyName"] //Once read, data will be lost 

Так сохраняются данные даже после того, как показано ниже

var Value = TempData["keyName"]; 
TempData.Keep();     //Data will not be lost for all Keys 
TempData.Keep("keyName");   //Data will not be lost for this Key 

TempData работает в новых вкладках/Windows также, как и переменная Session делает данные считаны вы можете Живым его.

Также можно использовать переменную сеанса. Только основная проблема заключается в том, что переменная Session очень тяжелая по сравнению с TempData. Наконец, вы также можете хранить данные через контроллеры/область.

подход - 2

Это работает для меня. Это очень просто и не нужно рассматривать какие-либо изменения в Web.Config или зарегистрировать фильтр действий в файле Global.asax.

ok. Итак, сначала создаю простой Action Filter. Это будет обрабатывать запросы Ajax и Non Ajax.

public class MyCustomErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     filterContext.ExceptionHandled = true; 
     var debugModeMsg = filterContext.HttpContext.IsDebuggingEnabled 
           ? filterContext.Exception.Message + 
           "\n" + 
           filterContext.Exception.StackTrace 
           : "Your error message"; 

// Это тот случай, когда вам нужно работать с Ajax просит

 if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new JsonResult 
      { 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
       Data = new 
       { 
        error = true, 
        message = debugModeMsg 
       } 
      }; 
     } 

// Это тот случай, когда вы регулируете запрос Non Ajax

 else 
     { 
      var routeData = new RouteData(); 
      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "Error"; 
      routeData.DataTokens["area"] = "app"; 
      routeData.Values["exception"] = debugModeMsg; 
      IController errorsController = new ErrorController(); 
      var exception = HttpContext.Current.Server.GetLastError(); 
      var httpException = exception as HttpException; 
      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (System.Web.HttpContext.Current.Response.StatusCode) 
       { 
        case 504: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      var rc = new RequestContext 
         (
          new HttpContextWrapper(HttpContext.Current), 
          routeData 
         ); 
      errorsController.Execute(rc); 
     } 
     base.OnException(filterContext); 
    } 
} 

Теперь вы можете реализовать этот фильтр действий на контроллере, а также только на Action. Пример:

enter image description here

Я собираюсь немного не по теме. Я думал, что это немного важно объяснить.

Если вы обратите внимание на вышеуказанную выделенную часть. Я указал порядок действия фильтра действий. Это в основном описывает порядок выполнения Action Filter. Это ситуация, когда у вас есть несколько действий фильтров реализованы через контроллер/метод действия

enter image description here

Эта картина просто указывает на то, что, скажем, у вас есть два действий фильтров. OnActionExecution начнет выполнение по приоритету, а OnActionExecuted начнет снизу вверх. Это означает, что в случае OnActionExecuted Action Filter с наивысшим порядком будет выполняться первым, а в случае OnActionExecuting Сначала будет выполняться действие фильтра с наименьшим порядком. Пример ниже.

public class Filter1 : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

// Выполнение начнется здесь - 1

 base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

// Выполнение будет двигаться здесь - 5

 base.OnActionExecuted(filterContext); 
    } 
} 

public class Filter2 : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

// Выполнение будет двигаться здесь - 2

 base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

// Выполнение wi будете двигаться здесь - 4

 base.OnActionExecuted(filterContext); 
    } 
} 

[HandleError] 
public class HomeController : Controller 
{ 
    [Filter1(Order = 1)] 
    [Filter2(Order = 2)] 
    public ActionResult Index() 
    { 

// Выполнение будет двигаться здесь - 3

 ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 
} 

Вы можете уже знать, что существуют различные типы фильтров в рамках MVC. Они перечислены ниже.

  1. Authorization фильтры

  2. Действие фильтров

  3. Response/Результат фильтры

  4. Исключение фильтры

Внутри каждого фильтра, вы можете задать свойство Order. Это в основном описывает порядок выполнения Action Filters.

+0

Спасибо за подробный ответ –

1

Используйте TempData для получения значения.

Некоторой особенность TempData

  • TempData является объектом словаря, который является производным от класса TempDataDictionary и хранится в короткой сессии жизни.
  • TempData Используется для передачи данных из текущего запроса в последующий запрос, что означает переадресацию.
  • Это очень короткая жизнь и лежит только до тех пор, пока целевой вид не будет полностью загружен.

  • Требуется типизация для сложного типа данных и проверка нулевых значений, чтобы избежать ошибки.

  • Используется для хранения только одноразовых сообщений, таких как сообщения об ошибках, сообщения проверки.

Смежные вопросы