2011-03-08 14 views
5

Digamos que tengo un controlador:¿Hay alguna forma de devolver un resultado de acción desde el controlador B desde el controlador A y proporcionar un modelo específico a B?

public BController : Controller 
{ 
    public ActionResult Foo(FooViewModel vm) 
    { 
     ... 
    } 
} 

y al mismo tiempo estoy poniendo en práctica una acción en otro controlador AController donde quiero hacer que el resultado de BController.Foo pasando un objeto modelo específico. Entonces:

public AController : Controller 
{ 
    public ActionResult Bar(BarViewModel vm) 
    { 
      FooViewModel fooVm = MakeFooVM(vm); 
      return ... ; // pass fooVm to BController 
    } 
} 

¿Hay alguna manera de lograr esto en MVC?

Respuesta

0

Usted puede hacer esto:

public AController : Controller 
{ 
    public ActionResult Bar(BarViewModel vm) 
    { 
      FooViewModel fooVm = MakeFooVM(vm); 
      var bController = new BController(); 
      return bController.Foo(fooVm); 
    } 
} 
+2

Esto vino a la mente, pero no estoy seguro si es aceptable en MVC para crear instancias de los controladores de "fuera" del marco adecuado. – Dejas

0

Tenga una mirada en esta dirección URL que explica cómo pasar parámetros al redirigir a partir de una acción a otra: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

la esperanza que esto es útil para usted.

+0

Me parece que usar la técnica que mencionaste requiere la descarga de una base de código de un tercero. ¿Es eso correcto? – Dejas

+0

@Dejas, tendrá que utilizar el atributo PassParametersDuringRedirect para su controlador –

5

Falta un paso en la respuesta anterior. Después de crear el controlador, debe configurar ControllerContext para que se llene la solicitud, respuesta y HttpContext del controlador. Solo crear el controlador dará como resultado valores nulos para la configuración de contexto del controlador.

public AController : Controller 
{ 
    public ActionResult Bar(BarViewModel vm) 
    { 
      FooViewModel fooVm = MakeFooVM(vm); 
      var bController = new BController(); 
      bController.ControllerContext = new ControllerContext(this.ControllerContext.RequestContext, bController); 
      return bController.Foo(fooVm); 
    } 
} 

Fuente: Get ActionResult of another controller-action?

+0

Si está intentando devolver un resultado de vista parcial de la otra acción del controlador, esto no funcionará porque los datos de la ruta serán del controlador original. – PJ7

+0

@ PJ7, consulte esta actualización http://stackoverflow.com/a/36483646/444382 – Brad

0

Una actualización de @WWC's answer que ayudará a la acción de destino sea capaz de encontrar el punto de vista que necesita.

public AController : Controller 
{ 
    public ActionResult Bar(BarViewModel vm) 
    { 
      FooViewModel fooVm = MakeFooVM(vm); 
      var bController = new BController(); 
      var bControllerContext = new ControllerContext(this.ControllerContext.RequestContext, bController); 
      // update route so action can find the (partial)view 
      bControllerContext.RouteData.Values["controller"] = "B"; 
      bController.ControllerContext = bControllerContext; 
      return bController.Foo(fooVm); 
    } 
} 
Cuestiones relacionadas