我有一个Controller类,其中包括以下方法: -
namespace SV.Controllers
{
public class VMController : Controller
{
public void populateViewData(IEnumerable<VM> vms)
{
//code goes here
现在如果我在另一个控制器类上,我怎么能调用VMController.populateViewDate
方法??
答案 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 });