Как мне обработать исключение в фабрике контроллеров ASP.NET MVC - PullRequest
6 голосов
/ 30 сентября 2010

У меня есть приложение ASP.NET MVC 2 с настраиваемой фабрикой контроллеров StructureMap для обработки внедрения зависимостей для моих контроллеров:

public class StructureMapControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext context, string controllerName)
    {
        Type controllerType = base.GetControllerType(context, controllerName);
        return ObjectFactory.GetInstance(controllerType) as IController;
    }
}

Я хотел бы знать, как я могу обрабатывать исключения в этой фабрике контроллеров, чтобычто они могут быть перенаправлены в ~ / Views / Shared / Error.aspx так же, как они находятся в контроллере с атрибутом HandleError.В настоящее время исключения не делают этого, несмотря на то, что для атрибута CustomErrors установлено значение «Вкл.»Маршрут по умолчанию:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

MVC соответствует этому маршруту и ​​передает имя контроллера «DoesNotExist» на мою фабрику контроллеров.Затем GetControllerType возвращает значение null и вызывает исключение нулевой ссылки при вызове StructureMap.Затем я хотел бы иметь возможность обработать это исключение.

Обратите внимание, что добавление последующего перехвата всех маршрутов не решит эту проблему - MVC соответствует маршруту по умолчанию.

Я знаю, что могу решить эту проблемуОсобая проблема заключается в наложении ограничений на маршрут по умолчанию для контроллера, но более общий вопрос о том, как я могу использовать обычный MVC ~ / Views / Shared / Error.aspx на заводе.

Обратите внимание, что я неЧтобы получить ответ, требуется тесная связь фабрики контроллеров с конкретным приложением MVC.В идеале этот завод должен находиться в сборке, на которую ссылаются, а не в том же решении.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Может быть, вы сможете адаптировать фабрику этого контроллера для обработки исключений.

0 голосов
/ 30 сентября 2010

Я бы создал контроллер ошибок, который вызывается фабрикой контроллеров, если он не может найти запрошенный контроллер. Затем внутри этого переопределите действие HandleUnknownAction, чтобы захватить любое запрашиваемое действие.

public class StructureMapControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext context, string controllerName)
    {
        Type controllerType = base.GetControllerType(context, controllerName);

        if (controllerType == null)
            return ObjectFactory.GetInstance(ErrorController) as IController;
        else
            return ObjectFactory.GetInstance(controllerType) as IController;
    }
}
...