我可以在控制器目标中使用控制器名称

时间:2014-07-17 06:54:30

标签: asp.net asp.net-mvc-routing

我想要一条接收来自

的请求的路线

/ API / V1 /工作

住在

的控制器

/ API / V1 / jobController

其中控制器名称为jobv1Controller

    configuration.Routes.MapHttpRoute(
        "v1",
        "Api/v1/{controller}/{id}",
        new { controller = "{controller}v1", id = RouteParameter.Optional });

1 个答案:

答案 0 :(得分:1)

简短版本:

内置DefaultControllerFactory可能无法创建您需要的控制器,因为它将值视为普通名称字符串,并且不会替换任何令牌。

解决方案是扩展DefaultControllerFactory并覆盖CreateController方法。更改controllerName值,然后使用基本功能来获取该控制器。

在Global.asax

中注册您的客户工厂
ControllerBuilder.Current.SetControllerFactory(
                                         typeof(YourCustomControllerFactory)); 

长版:

如您所知,流程如下:

请求>>路由系统>> MVC的默认控制器工厂>>创建控制器>>调用它。

我不认为可以在默认路由数据字典中提供动态值,并期望默认控制器工厂找到该控制器。

这是因为内置控制器工厂处理路径数据字典中给出的控制器键的直接值。

MVC处理程序没有尝试解析作为某些格式化字符串提供的控制器值,并以此格式关联Url Fragment值(控制器/操作等)。它认为它是一个直接值。

默认情况下,调用DefaultControllerFactory以获取控制器类型,并使用字符串值按原样激活控制器类型。

因此,解决问题的一种方法是定义实现IControllerFactory

的自定义工厂

一旦你这样做,你的工厂

将调用

CreateController方法,并将RequestContextControllerName字符串作为2个参数。

RequestContext包含RequestContext.RouteData.Values字典,其中包含所有路由数据,令牌,约束,命名空间等。

获得传入的控制器名称后,您可以按照所需的格式(controllername +" v1")按摩它,然后实例化该控制器(使用DI容器或Service Locator或Activator.CreateInstance等)。无论你想要什么)并归还它。尝试使用某种查找缓存。

一旦实现了自定义工厂,就可以在Global.asax中注册自定义控制器工厂和MVC,如下所示:

ControllerBuilder.Current.SetControllerFactory(
        typeof(YourCustomControllerFactory));