如何调用另一个控制器操作从Mvc中的控制器

时间:2013-06-01 07:49:28

标签: c# asp.net-mvc asp.net-mvc-4

我需要从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();
    }

10 个答案:

答案 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();