我需要从Controller A调用一个控制器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();
}
答案 0 :(得分:155)
正如@mxmissile在对已接受答案的评论中所说,你不应该新建控制器,因为它将缺少为IoC设置的依赖关系,并且不会有HttpContext
。
相反,您应该得到一个控制器实例:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
答案 1 :(得分:90)
控制器只是类 - 新的一个并且像调用其他类成员一样调用action方法:
var result = new ControllerB().FileUploadMsgView("some string");
答案 2 :(得分:58)
您的示例看起来像伪代码。您需要返回 RedirectToAction
:
return RedirectToAction("B",
"FileUploadMsgView",
new { FileUploadMsg = "File uploaded successfully" });
答案 3 :(得分:13)
正如@DLeh所说 请使用
var controller = DependencyResolver.Current.GetService<ControllerB>();
但是,给控制器一个控制器上下文非常重要,尤其是当您需要访问{child}控制器内的User
对象,Server
对象或HttpContext
时。 / p>
我添加了一行代码:
controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);
或者您也可以使用System.Web访问当前上下文,访问Server
或早期提到的对象
注意:我的目标是框架版本4.6(Mvc5)
答案 4 :(得分:6)
让解析器自动执行此操作。
控制器内部:
public class AController : ApiController
{
private readonly BController _bController;
public AController(
BController bController)
{
_bController = bController;
}
public httpMethod{
var result = _bController.OtherMethodBController(parameters);
....
}
}
答案 5 :(得分:6)
我知道它很旧,但是您可以:
答案 6 :(得分:3)
Dleh's answer是正确的,并解释如何获取另一个控制器的实例,而不会错过为IoC设置的依赖关系
但是,我们现在需要从另一个控制器调用该方法 完整的答案是:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
答案 7 :(得分:1)
在发现RedirectToAction()
不会传递复杂的类对象后,这正是我所寻找的。
作为示例,我想调用IndexComparison
控制器中的LifeCycleEffectsResults
方法,并将其传递给名为model的复杂类对象。
以下是失败的代码:
return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);
值得注意的是,字符串,整数等在这个控制器方法的行程中幸存下来,但是通用列表对象遭受了让人联想到C内存泄漏的内容。
如上所述,这里的代码我用以下代码替换:
var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();
var result = controller.IndexComparison(model);
return result;
现在一切正常。感谢您带路。
答案 8 :(得分:1)
如果问题是打电话。 你可以使用这种方法调用它。
public class ListItem extends AppCompatActivity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_item);
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
final View vw=layoutInflater.inflate(R.layout.list_item,null);
final Context context=vw.getContext();
ImageView imgv=(ImageView)findViewById(R.id.map);
imgv.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.i("ListItem","This Onclick worked ok");
Intent intent=new Intent(context,MapView.class);
intent.putExtra("lat",lat);
intent.putExtra("lang",lang);
startActivity(intent);
}
}
答案 9 :(得分:1)
如果有人正在寻找如何在.net核心中执行此操作,我可以通过在启动时添加控制器来实现它
services.AddTransient<MyControllerIwantToInject>();
然后将其注入另一个控制器
public class controllerBeingInjectedInto : ControllerBase
{
private readonly MyControllerIwantToInject _myControllerIwantToInject
public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
_myControllerIwantToInject = myControllerIwantToInject;
}
然后像这样_myControllerIwantToInject.MyMethodINeed();