Necesito llamar a una acción del controlador B FileUploadMsgView desde el controlador A y necesito pasarle un parámetro.
Code---its not going to the controller B's FileUploadMsgView().
In ControllerA
private void Test()
{
try
{//some codes here
ViewBag.FileUploadMsg = "File uploaded successfully.";
ViewBag.FileUploadFlag = "2";
RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" });
}
In ControllerB receiving part
public ActionResult FileUploadMsgView(string FileUploadMsg)
{
return View();
}
c#
asp.net-mvc
asp.net-mvc-4
usuario2156088
fuente
fuente
Respuestas:
Los controladores son solo clases: uno nuevo y llama al método de acción como lo haría con cualquier otro miembro de la clase:
var result = new ControllerB().FileUploadMsgView("some string");
fuente
var controller = DependencyResolver.Current.GetService<ControllerB>();
Como @mxmissile dice en los comentarios a la respuesta aceptada, no debe renovar el controlador porque le faltarán dependencias configuradas para IoC y no tendrá el
HttpContext
.En cambio, debería obtener una instancia de su controlador como esta:
fuente
HttpContext
inyección.var controller
se le asignaría el tipoControllerB
, sí.HttpContext
). Creo que usé este enfoque sin ningún IoC para obtener un objeto controlador "superficial" (solo necesitaba acceso a cierta funcionalidad) y al principio estaba confundido acerca de por qué faltaban las partes. [aparte: trabajé alrededor mientras todavía usaba este enfoque, pero probablemente debería haber reestructurado esa funcionalidad en una clase compartida.] En cuanto a la configuración y las opciones de IoC, tendría que remitirlo a otros artículos / preguntas SO.Su muestra se parece al código psuedo. Debe devolver el resultado de
RedirectToAction
:fuente
como @DLeh dice Usar más bien
Pero, al darle al controlador, un contexto de controlador es importante, especialmente cuando necesita acceder al
User
objeto,Server
objeto o alHttpContext
interior del controlador 'secundario'.He agregado una línea de código:
o de lo contrario podría haber utilizado System.Web para acceder también al contexto actual, para acceder a
Server
los objetos mencionados anteriormenteNB: estoy apuntando al framework versión 4.6 (Mvc5)
fuente
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
Suponiendo que está intentando devolver el resultado de la acción de Índice en HomeController.this
lugar de hacerlocontroller
. Finalmente, el resultado regresa a través del controlador local (esto), así que eso es lo que termina tratando de encontrar la vista.return View("ViewName");
soloreturn View();
Deje que el resolutor lo haga automáticamente.
Dentro de un controlador:
fuente
Si alguien está buscando cómo hacer esto en .net core, lo logré agregando el controlador en el inicio
Luego inyectándolo en el otro controlador
Entonces solo llámalo así
_myControllerIwantToInject.MyMethodINeed();
fuente
Esto es exactamente lo que estaba buscando después de encontrar eso
RedirectToAction()
no pasaría objetos de clase complejos.Como ejemplo, quiero llamar al
IndexComparison
método en elLifeCycleEffectsResults
controlador y pasarle un objeto de clase complejo llamado modelo.Aquí está el código que falló:
Vale la pena señalar que las cadenas, los enteros, etc., sobrevivieron al viaje a este método de controlador, pero los objetos genéricos de la lista estaban sufriendo lo que recordaba las pérdidas de memoria C.
Como se recomienda anteriormente, aquí está el código con el que lo reemplacé:
Todo está funcionando según lo previsto ahora. Gracias por liderar el camino.
fuente
La respuesta de Dleh es correcta y explica cómo obtener una instancia de otro controlador sin perder dependencias configuradas para IoC
Sin embargo, ahora necesitamos llamar al método desde este otro controlador.
La respuesta completa sería:
fuente
Sé que es viejo, pero puedes:
fuente
Si el problema es llamar. Puedes llamarlo usando este método.
fuente
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));