2014-10-12 4 views
0

MVC 6 알파 4에서 몇 가지 실험을하고 있습니다. 컨트롤러를 수동으로 활성화하고 HomeController 대신 반환하지만 작동하지 않습니다. 어떤 도움을주십시오 ..수동으로 MVC 6에서 컨트롤러를 인스턴스화합니다. alpha4

지금까지이 코드를 사용하여 자체 컨트롤러 팩토리를 만들었습니다.

public class MyControllerFactory : IControllerFactory 
{ 
    public object CreateController(ActionContext actionContext) 
    { 
    var actionDescriptor = actionContext.ActionDescriptor as Microsoft.AspNet.Mvc.ReflectedActionDescriptor; 

    Type controllerType = Type.GetType("Hello.Controllers.MyController"); 
    var controller = _typeActivator.CreateInstance(_serviceProvider, controllerType); 

    actionContext.Controller = controller; 
    _controllerActivator.Activate(controller, actionContext); 

    return controller; 
    } 
} 

코드를 디버깅했습니다. MyController의 생성자가 호출되고 MyControllerCreateController 메서드에서 반환되지만 오류가 발생합니다. 디버거는 IActionResult Index()에 도달하지 않습니다. 여기에 오류가 있습니다.

System.Reflection.TargetException: Object does not match target type. 
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) 
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr,  Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder,  Object[] parameters, CultureInfo culture) 
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
at Microsoft.AspNet.Mvc.ReflectedActionExecutor.<ExecuteAsync>d__2.MoveNext() 
+0

"HomeController 대신"은 무엇을 의미합니까? 왜 당신의 "HomeController"가 여기에 선택되지 않도록 당신의 경로를 바꾸지 않습니까? – bzlm

답변

1

여기가 답입니다.

첫째, MyControllerHomeController에서 상속되어야합니다.
둘째, 컨트롤러를 활성화하기 전에 RouteData에서 '컨트롤러'값을 변경해야합니다.

actionContext.RouteData.Values["controller"] = "My";