Мне нужно позвонить в контроллер b действие FileUploadMsgView от контроллера и нужно передать параметр для него.
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();
}
Как @mxmissile говорит в комментарии принято отвечать, Вы должен'т нового контроллера, потому что он будет отсутствовать зависимостей создана для МОК и выиграл'т у свойство 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>();
Но, давая контроллер, контроллером контексте-это важно, особенно когда вам нужно получить доступ к пользователя объекта,
сервер` объект, или свойство HttpContext внутри 'ребенок' контроллер.
Я добавил строку кода:
controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);
или еще вы могли бы использовать систему.Веб тоже вход текущий контекст, чтобы открыть "сервер" или ранние основных объектов
NB: меня ориентируетесь в Framework версии 4.6 (Mvc5)
Пусть арбитр автоматически делать это.
Внутри контроллера:
public class AController : ApiController
{
private readonly BController _bController;
public AController(
BController bController)
{
_bController = bController;
}
public httpMethod{
var result = _bController.OtherMethodBController(parameters);
....
}
}
Если кто-то ищет способы сделать это .чистая ядра я сделал это путем добавления контроллера в автозагрузку
services.AddTransient<MyControllerIwantToInject>();
Затем впрыскивая его в другой контроллер
public class controllerBeingInjectedInto : ControllerBase
{
private readonly MyControllerIwantToInject _myControllerIwantToInject
public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
_myControllerIwantToInject = myControllerIwantToInject;
}
Тогда просто называйте это как так _myControllerIwantToInject.MyMethodINeed();
Dleh'ы ответ является правильным и объяснить, как получить экземпляр другой контроллер без недостающих зависимостей создана для МОК
Однако, теперь нам нужно вызвать метод из этого другого контроллера. Полный ответ будет :
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
и передать его сложный объект класса с именем модели.
Вот код, который не удалось:<БР />
return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);
Стоит отметить, что строки, целые числа и т. д. были пережить путешествие в этот метод контроллера, но родовые объекты список страдали от того, что напоминает с утечками памяти.
Как было рекомендовано выше, здесь'ы код Я заменил его:<БР />
var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();
var result = controller.IndexComparison(model);
return result;
Все работает, как задумано сейчас. Спасибо за лидером.
если проблема заключается в вызове. вы можете называть это, используя этот метод.
yourController obj= new yourController();
obj.yourAction();