Это дубликат универсального контроллера asp.net mvc , который на самом деле содержит правильный ответ. Ответ Джеффа Фрица абсолютно неверен. Создание собственного IControllerFactory не обойдёт ограничение в ExpressionHelper.GetRouteValuesFromExpression, которое генерирует ошибку, которую вы видите. Реализация собственной IControllerFactory по-прежнему будет вызывать ошибки при вызове RedirectToAction, BuildUrlFromExpression, ActionLink, RenderAction, BeginForm, любых любых методов, которые их вызывают.
Что меня интересует, так это то, что «ограничение по соглашению» Microsoft уже применено ограничением «где TController: Controller», которое накладывается на тип в методе ExpressionHelper.GetRouteValuesFromExpression. Ни один универсальный шаблон никогда не удовлетворит валидацию соглашения:
string controllerName = typeof(TController).Name;
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) {
throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action");
}
, если только он не наследуется классом, оканчивающимся на "Controller", потому что typeof (AnyGeneric) .Name никогда не заканчивается на "Controller".