1

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

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

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

4

4 回答 4

3

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

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

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

ViewDataHelpers.PopulateViewData(viewModels);

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

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

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

viewModels.PopulateViewData();

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

于 2013-10-25T13:40:00.923 回答
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 的回答中,有一个助手类。

编辑:一些小的调整

于 2013-10-25T13:41:10.910 回答
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);
    }
  }
}
于 2013-10-25T13:28:09.830 回答
0

除了利亚姆的回答之外,您还可以从您的操作中执行以下操作:

IEnumerable<VM> _vms;

return RedirectToAction("VM", "populateViewData", new { vms =_vms  });
于 2013-10-25T13:34:58.977 回答