Настраиваемое сообщение об исключении, отображаемое в ASP MVC - PullRequest
0 голосов
/ 31 марта 2012

Я создал собственное исключение и выкидываю экземпляр этого класса всякий раз, когда считаю, что мое приложение находится в «исключительном состоянии».Это исключение выдается в классе логики приложения (в моем случае это сервис).Теперь у меня также есть перенаправление исключений ASP MVC по умолчанию, но в случае этих пользовательских исключений я не хочу, чтобы оно перенаправляло на страницу «Ошибка», а отображало сообщение в div (например, в моемLayout.cshtml page).Я думал о добавлении сообщения об исключении в TempData ["ApplicationError"].Я хочу написать этот код только один раз, а не во всех методах действия моего контроллера.Итак, в моем базовом классе контроллеров я переопределил protected void OnException (ExceptionContext filterContext) и мой код выглядит так:

protected override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception is InvalidOperationException)
            TempData["ApplicationError"] = filterContext.Exception.Message;
        else
            base.OnException(filterContext);
    }

Моя проблема заключается в том, что я все еще перенаправлен на ошибку по умолчаниюстраница, когда выбрасывается это исключение.Я не хочу, чтобы это случилось.Я хочу, чтобы сообщение настраиваемого исключения отображалось в дружественном элементе в том же представлении, что и пользователь.У вас есть идеи, как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2012

Попробуйте указать, что вы обработали исключение, установив свойство ExceptionHandled:

protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext.Exception is InvalidOperationException)
    {
        filterContext.ExceptionHandled = true;
        var viewResult = new ViewResult();
        viewResult.ViewData["ApplicationError"] = filterContext.Exception.Message;
        filterContext.Result = viewResult;
    }
}

Важным аспектом является то, что, поскольку внутри действия контроллера было исключение, оно не дошло до того, что был возвращен результат действия. Таким образом, вы больше не знаете, должно ли действие отображать представление, возвращать JSON, перенаправлять или что-то еще. Таким образом, вы можете предположить, что он хочет визуализировать представление, установив свойство filterContext.Result. Очевидно, что если у вас есть модель представления, связанная с этим представлением, вы не сможете восстановить ее. Поэтому убедитесь, что ваше представление организовано таким образом, что если внутри ViewData["ApplicationError"] что-то есть, даже не пытайтесь что-либо делать с вашей моделью представления, так как у вас ее не будет => помните, что ваше приложение упало в середине выполнение акции.

0 голосов
/ 31 марта 2012

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

public class BaseViewModel
{
  public string ErrorMessage { set;get;}
  public string SuccessMessage {set;get;}
  public bool IsValid { set;get;}
} 

public class UserViewModel: BaseViewModel
{
  // user properties
}

И в моем контроллере

public ActionResult Get(int id)
{

  UserViewModel ovjUser;
  try
  {
    objUser=MyService.GetUser(id);
    if(!objUser.IsValid)
    {
       objUser.ErrorMessage="This User Account is not Valid";
    }
  }
  catch(Exception ex)
  {
   // log error
    objUser.ErrorMessage="Application is buzy now!.Pls try later";
  }
  return View(objUser);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...