Чистая обработка обычных ошибок - PullRequest
2 голосов
/ 10 декабря 2010

Я использую этот шаблон повсеместно, чтобы получить данные из базы данных и отобразить представление:

    public ActionResult Index(int? id)
    {
        RequestViewModel model;
        model = this.ClientRepository.GetRequest(id);

        return View("~/Views/Requests/Index.aspx", model);
    }

Если репозиторий возвращает ноль, то есть в случае, если запись не существует, тогда моя страница вылетает и выдает ошибку, потому что модель нулевая.

Я бы хотел показать дружеское сообщение «Запрошенная запись не найдена» вместо желтой страницы смерти или обычной страницы «Произошла ошибка».

Каков рекомендуемый шаблон для обработки «обычных» ошибок в отличие от необработанных исключений?

Спасибо

Rick

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Вы можете написать фильтр действий:

public class NullModelCheckerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var viewResult = filterContext.Result as ViewResultBase;
        if (viewResult != null && viewResult.ViewData.Model == null)
        {
            // If the action selected a view to render and passed a null model
            // render the NotFound.aspx view
            var result = new ViewResult();
            result.ViewName = "~/Views/Errors/NotFound.aspx";
            filterContext.HttpContext.Response.StatusCode = 404;
            filterContext.Result = result;
        }
    }
}

А затем украсьте свой базовый контроллер (от которого происходят все ваши контроллеры) следующим атрибутом:

[NullModelChecker]
public class BaseController: Controller
{ }

Таким образом, ваш текущий код остается нетронутым.

- ОБНОВЛЕНИЕ:

В ASP.NET MVC 3 вы можете зарегистрировать свой фильтр действий глобально , даже не украшая им базовый контроллер. Просто добавьте следующее к вашему Application_Start в Global.asax:

GlobalFilters.Filters.Add(new NullModelCheckerAttribute());
0 голосов
/ 10 декабря 2010

Я не знаком с ASP.NET MVC. Я знаком с Spring MVC.

Почему вы не можете просто поставить простое условие if-else? Как этот:

public ActionResult Index(int? id)
{
    RequestViewModel model;
    model = this.ClientRepository.GetRequest(id);

    if (model == null) {
        return View("~/Views/Requests/FriendlyError.aspx");
    }

    return View("~/Views/Requests/Index.aspx", model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...