Как вызвать другое действие контроллера из контроллера в Mvc
Мне нужно вызвать контроллер B action FileUploadMsgView из контроллера A и нужно передать для него параметр.
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();
}
9 ответов:
контроллеры-это просто классы-новые и вызывают метод действия так же, как и любой другой член класса:
var result = new ControllerB().FileUploadMsgView("some string");
Как говорит @mxmissile в комментариях к принятому ответу, вы не должны создавать новый контроллер, потому что он будет отсутствовать зависимости, настроенные для IoC, и не будет иметь
HttpContext.вместо этого, вы должны получить экземпляр контроллера такой:
var controller = DependencyResolver.Current.GetService<ControllerB>(); controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
ваш образец выглядит как псевдо-код. Вам нужно возвращение результат
RedirectToAction:return RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" });
как говорит @DLeh Использовать вместо
var controller = DependencyResolver.Current.GetService<ControllerB>();но, давая контроллер, контекст controlller важен, особенно когда вам нужно получить доступ к
пусть решатель автоматически сделает это.
внутри контроллера:
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);стоит отметить, что строки, целые числа и т. д. переживали поездку в этот метод контроллера, но общие объекты списка страдали от того, что было напоминает с утечками памяти.
как рекомендовано выше, вот код, который Я заменил его:
var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>(); var result = controller.IndexComparison(model); return result;все работает, как задумано сейчас. Спасибо за лидером.
если проблема заключается в вызове. вы можете вызвать его с помощью этого метода.
yourController obj= new yourController(); obj.yourAction();
public ActionResult First_controller() { return Redirect("~/File_upload/Second_controller"); } public ActionResult Second_controller() { return View(); }
Comments