为另一个Controller类调用Controller类public Void方法

时间:2013-10-25 13:26:54

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

我有一个Controller类,其中包括以下方法: -

namespace SV.Controllers
{   
    public class VMController : Controller
    {
public void populateViewData(IEnumerable<VM> vms)
        {
//code goes here

现在如果我在另一个控制器类上,我怎么能调用VMController.populateViewDate方法??

4 个答案:

答案 0 :(得分:3)

在我看来,使用其他控制器的辅助方法是一种不好的做法/设计。您应该将这些方法重构为可以从两个控制器访问的辅助类。琐碎的例子:

public static ViewDataHelpers
{
    public static void PopulateViewData(IEnumerable<VM> vms)
    {
        // ...
    }
}

现在您可以在任何控制器中使用它:

ViewDataHelpers.PopulateViewData(viewModels);

如果您愿意,也可以将其更改为扩展方法:

public static void PopulateViewData(this IEnumerable<VM> vms)
{
    // ...
}

控制器中的调用如下所示:

viewModels.PopulateViewData();

这只是语法糖,结果会一样。

答案 1 :(得分:2)

我认为你不应该增加控制器之间的依赖关系。每个人都有自己的工作要做。如果它们之间需要通用的方法或属性,则可以创建基本控制器类:

public abstract class BaseVMController : Controller
{
  protected virtual void PopulateViewData(IEnumerable<VM> vms)
  { 
      // ...
  }
}

public class VMController : BaseVMController 
{
  public void NewMethod()
  { 
      IEnumerable<VM> vms;
      PopulateViewData(vms);
      // ...
  }
}

public class VMController2 : BaseVMController 
{
  public void NewMethod2(IEnumerable<VM> vms)
  { 
      PopulateViewData(vms);
      // ...
  }

  protected override void PopulateViewData(IEnumerable<VM> vms)
  { 
      base.PopulateViewData(vms);
      // some additional behavior ...
  }
}

另一个很好的可能性是在Henk Mollema的回答中,有一个辅助班。

编辑:一些小调整

答案 2 :(得分:1)

控制器只是一个类,就像任何其他类一样。

using SV.Controllers;

namespace SV.Controllers2
{
  public class VMController2 : Controller
  {
    public void NewMethod()
    { 
        //instanciate vms here....
        IEnumerable<VM> vms;
        VMController controller = new VmController();
        controller.populateViewData(vms);
    }
  }
}

答案 3 :(得分:0)

除了利亚姆的回答,你也可以从你的行动中做到这一点:

IEnumerable<VM> _vms;

return RedirectToAction("VM", "populateViewData", new { vms =_vms  });
相关问题