Что вы можете сделать, это создать собственную фабрику контроллеров. Таким образом, вы можете иметь собственный код, чтобы решить, какой контроллер нужно вызывать, когда.
public class CustomControllerFactory : IControllerFactory
{
#region IControllerFactory Members
public IController CreateController(RequestContext requestContext, string controllerName)
{
if (string.IsNullOrEmpty(controllerName))
throw new ArgumentNullException("controllerName");
//string language = requestContext.HttpContext.Request.Headers["Accept-Language"];
//can be used to translate controller name and get correct controller even when url is in foreign language
//format controller name
controllerName = String.Format("MyNamespace.Controllers.{0}Controller",controllerName.Replace("-","_"));
IController controller = Activator.CreateInstance(Type.GetType(controllerName)) as IController;
controller.ActionInvoker = new CustomInvoker(); //only when using custominvoker for actionname rewriting
return controller;
}
public void ReleaseController(IController controller)
{
if (controller is IDisposable)
(controller as IDisposable).Dispose();
else
controller = null;
}
#endregion
}
Чтобы использовать этот собственный контроллер, вы должны добавить его в ваш global.asax
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));
}
Обратите внимание, что это работает только для контроллера, а не для действий ... Чтобы подключить пользовательскую перезапись действий до их выполнения, используйте этот код:
public class CustomInvoker : ControllerActionInvoker
{
#region IActionInvoker Members
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
return base.InvokeAction(controllerContext, actionName.Replace("-", "_"));
}
#endregion
}
Я получил большую часть этого кода из этого блога и настроил его под свои нужды. В моем случае я хочу, чтобы тире отделяли слова в имени моего контроллера, но вы не можете создать действие с дефисом в имени.
Надеюсь, это поможет!