Ответ 1
Контроллеры - это только классы - новый и вызов метода действия, как и любой другой член класса:
var result = new ControllerB().FileUploadMsgView("some string");
Мне нужно вызвать контроллер B действие FileUploadMsgView из контроллера A и передать ему параметр.
Code---its not going to the controller B 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();
}
Контроллеры - это только классы - новый и вызов метода действия, как и любой другой член класса:
var result = new ControllerB().FileUploadMsgView("some string");
Как говорит @mxmissile в комментариях к принятому ответу, вы не должны обновлять контроллер, поскольку в нем будут отсутствовать зависимости, установленные для IoC, и не будет HttpContext
.
Вместо этого вы должны получить экземпляр вашего контроллера следующим образом:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
Ваш образец выглядит как код psuedo. Вам нужно вернуть результат RedirectToAction
:
return RedirectToAction("B",
"FileUploadMsgView",
new { FileUploadMsg = "File uploaded successfully" });
как говорит @DLeh Используйте скорее
var controller = DependencyResolver.Current.GetService<ControllerB>();
Но, давая контроллеру, контекст controlller важен, особенно когда вам нужно получить доступ к объекту User
, объекту Server
или HttpContext
внутри дочернего контроллера.
Я добавил строку кода:
controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);
иначе вы могли бы использовать System.Web для доступа к текущему контексту, чтобы получить доступ к Server
или к ранним metioned объектам
NB: я нацелен на фреймворк версии 4.6 (Mvc5)
Позволяет распознателю автоматически делать это.
Внутри контроллера A:
public class AController : ApiController
{
private readonly BController _bController;
public AController(
BController bController)
{
_bController = bController;
}
public httpMethod{
var result = _bController.OtherMethodBController(parameters);
....
}
}
Dleh ответ правильный и объясните, как получить экземпляр другого контроллера без отсутствия зависимостей, настроенных для IoC
Однако теперь нам нужно вызвать метод из этого другого контроллера.
Полный ответ будет:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
Это именно то, что я искал, обнаружив, что RedirectToAction()
не будет передавать сложные объекты класса.
В качестве примера я хочу вызвать метод IndexComparison
в контроллере LifeCycleEffectsResults
и передать ему сложный объект класса с именем model.
Вот код, который не удалось:
return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);
Стоит отметить, что строки, целые числа и т.д. выжили в пути к этому методу контроллера, но общие объекты списка страдали от того, что напоминало утечки памяти C.
Как было рекомендовано выше, здесь код, который я заменил на него:
var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();
var result = controller.IndexComparison(model);
return result;
Все работает по-настоящему. Спасибо за то, что вы проложили путь.
если проблема заключается в вызове. вы можете вызвать его с помощью этого метода.
yourController obj= new yourController();
obj.yourAction();
Если кто-то смотрит на то, как это сделать в ядре.net, я сделал это, добавив контроллер при запуске.
services.AddTransient<MyControllerIwantToInject>();
Затем вводить его в другой контроллер
public class controllerBeingInjectedInto : ControllerBase
{
private readonly MyControllerIwantToInject _myControllerIwantToInject
public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
_myControllerIwantToInject = myControllerIwantToInject;
}
Затем просто назовите его так, как _myControllerIwantToInject.MyMethodINeed();
public ActionResult First_controller()
{
return Redirect("~/File_upload/Second_controller");
}
public ActionResult Second_controller()
{
return View();
}