C # использовать атрибут для обработки исключений в MVC - PullRequest
1 голос
/ 12 февраля 2010

Я хочу обрабатывать исключения, генерируемые любым действием контроллера, с моделью ErrorView и представлением ошибок. Идея заключалась в том, чтобы иметь что-то вроде:

[InformClientOfExceptions(typeof(MyErrorHandler))]
public ActionResult MyAction(Int32 someId)
{
    //...code
}

Тогда, возможно, есть некоторый класс MyErrorHandler, который реализует новый интерфейс IErrorView:

public class MyErrorHander : IErrorView
{
    public ActionResult OnException(Exception ex)
    {
        //..code which converts exception to some error view model and returns the view

Когда в результате действия выдается исключение, атрибут подготавливает указанный класс и передает ему исключение, а затем обрабатывается исключение (в базовом случае форматируется и выводится) Да, исключения никогда не должны возникать или, по крайней мере, должны обрабатываться должным образом, но я бы хотел лучше написать это. Я не хочу использовать пользовательскую страницу ошибок, поскольку хочу расширить этот шаблон, чтобы учесть более сложные ответы на определенные типы исключений. Есть идеи, как лучше к этому подойти?

Ответы [ 4 ]

1 голос
/ 12 февраля 2010

[HandleError] будет искать Error представление по умолчанию. Вы можете указать вид и ограничить исключениями параметры

[HandleError(ExceptionType = typeof(ArgumentException), View = "ErrorViewForThatException"]

Вы можете поместить этот атрибут в классы действий или контроллеров. Это не совсем то, что вы хотите, но это очень близко.

0 голосов
/ 12 февраля 2010

Кроме того, если вы используете конструкцию, которая по умолчанию включена в MVC, такую ​​как методология [HandleError], то, что вы на самом деле обсуждаете, это Аспектно-ориентированное программирование (AOP). Чтобы создать AOP-решение, похожее на это, вам нужно будет использовать ткацкий фреймворк после сборки, который объединит код для достижения желаемых результатов, такой как PostSharp или LinFu.AOP. Чтобы достичь этого без компоновки ткачества сборки, вам нужно будет обрабатывать ее через интерфейсы и использовать динамические прокси, такие как Castle.DynamicProxy или LinFu.DynamicProxy.

0 голосов
/ 12 февраля 2010

Создайте класс, который наследуется от FilterAttribute и реализует атрибут IExceptionFilter (что-то подобное). Эта комбинация используется для регистрации исключений, и вы можете выбрать тип объекта, который будет использоваться для регистрации исключений, как вы указали.

0 голосов
/ 12 февраля 2010

Вы пробовали [HandleError]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...