2

我有以下方法,它接受一个 id 数组并填充一个视图数据参数,如下所示:-

 private void populateViewData(long[] it360ids)
        {
            var resources = repository.GetResources(it360ids);
            foreach (var resource in resources)
            {
                string c = resource.RESOURCENAME;
                long id = resource.RESOURCEID;

                ViewData["NAME" + resource.RESOURCEID.ToString()] = resource.RESOURCENAME;
                ViewData["CustomerNAME" + resource.RESOURCEID.ToString()] = resource.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME;

        }

我在大多数控制器类中都使用了这个方法,目前我在每个控制器类的末尾添加了这个方法。但我的问题是如何在一个地方定义这个方法并从我的关联操作方法中引用它?谢谢

4

2 回答 2

7

您可以创建自己的 ControllerBase :

public class MyController : Controller
{
    protected void populateViewData(long[] it360ids) { ... }
}

之后,您必须MyController在所有现有的控制器中使用:

public class HomeController : MyController { ... }

希望能帮助到你 !

于 2013-11-13T09:55:55.437 回答
0

基类是一个很好的选择,另一种方法是通过依赖注入

创建接口

public interface IViewDataPopulator
{
    void populateViewData(long[] it360ids,ViewDataDictionary ViewData);
}

创建至少一个实现

public class BasicViewDataPopulator:IViewDataPopulator
{
  public void populateViewData(long[] it360ids,ViewDataDictionary ViewData)
  { 
     //code goes here
  }
}

声明对控制器构造函数的依赖

public class MyController
{
   readonly IViewDataPopulator _populator;
   public MyController(IViewDataPopulator populator)
   {
      if (populator==null) throw new ArgumentNullException("populator"); //etc, etc
      //store it...
      _populator=populator;
   }
}

接线

在您的 MVC 项目中设置一个 IoC 框架(Ninject、Unity 等)来处理实际的注入,从而对于给定的接口(IViewDataPopulator)请求,它将分发给定的实现(例如BasicViewDataPopulator

  • 这种方法的一个优点是,因为您是通过接口注入的,所以您可以轻松处理某些控制器可能需要稍微不同的功能的情况——在这种情况下,您只需创建一个新的实现(例如,SpecialCaseViewDataPopulator)并修改您的 DI 设置以备不时之需当请求特定控制器等时,输出该类的实例。

最后!

现在,您的控制器的所有 Action 方法都可以_populator.populateViewData在他们喜欢的任何时间使用,而无需知道它是否为BasicViewDataPopulator,SpecialCaseViewDataPopulator等。

于 2013-11-13T10:57:10.583 回答