如何将参数传递给MVC中的GenericController构造函数?

时间:2016-03-21 20:50:45

标签: c# asp.net-mvc generics

我有一个GenericController,它有以下方法:

public class GenericGridController<T, TKey>:Controller
    where T : class
    where TKey : IComparable
{
    string GetFilterParam();
    string GetGridPartialName();
    List<T> GetGridModel(TKey param);
    List<T> GetGridModel(T entity);
    ActionResult GetGrid(TKey param);
    ActionResult Add(T entity);
    ActionResult Edit(T entity);
    ActionResult Delete(T entity);
}

当我需要创建一个网格时,我正在创建一个新的控制器,继承自GenericGridController,我需要覆盖GetFilterParam和GetGridParialName,以提供特定的名称。

这很好用。现在我想不要覆盖2个方法,并且:

我正在尝试做一些我不理解的事情&#34;:   - 我在通用控制器中创建了2个字符串属性   - 我从构造函数初始化它们,如:

    public string FilterParam { get; set; }
    public string GridPartialName { get; set; }

    public GenericGridController(string filterParamName, string partialName)
    {
        FilterParam = filterParamName;
        GridPartialName = partialName;
    }

然后我创建了一个新的TestController,继承自GenerigGridController,我看到他要求实现缺少的构造函数,如下所示:

public class TestController : GenericGridController<Candidat,int>
    {
        public TestController(string filterParamName, string partialName)
            : base(filterParamName, partialName)
        {

        }        
    }

我原本希望做这样的事情:

 public class TestController : GenericGridController<Candidat,int>("param","PartialView"){}

我的问题是:如何在GenericGridController构造函数中提供需要它的2个参数。

也许是一个愚蠢的问题,我只是想了解它是如何工作的。

3 个答案:

答案 0 :(得分:2)

您不能将参数 value 作为类声明的一部分。

我想到了两个解决方案:

  1. 使用具有默认值的属性并在派生类中进行覆盖 public string FilterParam { get; set; } public string GridPartialName { get; set; }

    public GenericGridController() { this.FilterParam = "defaultFilterParamValue"; this.GridPartialName = "defaultGridPartialNameValue"; }

  2. 并在派生类

    public DerivedGridController()
    {
        this.FilterParam = "foo";
        this.GridPartialName = "derived";
    }
    
    1. 将这些属性声明为abstract
    2. public abstract string FilterParam { get; } public abstract string GridPartialName { get; } 使用abstract强制每个派生类实现返回常量或计算值的属性

      public override string FilterParam { get { return "myFilterParam"; } }
      

答案 1 :(得分:2)

重述我对此问题的理解:您希望将静态值从派生类传递给基础构造函数。

您似乎试图在类定义中执行此操作。这不行。但是,您可以声明自己的构造函数并更改参数。这是一个例子:

public class TestController : GenericGridController<Candidat,int>
{
    public TestController()
        : base("param","PartialView")
    {

    }        
}

现在您可以使用new TestController()实例化此类,它会自动为您提供"param""PartialView"值到基础构造函数。

答案 2 :(得分:0)

我认为你正在寻找类似的东西:

<button id='btnResize'>Size x 2</button><br/>
<canvas id="can" width="100" height="100"></canvas>

定义了无参数构造函数后,您现在可以创建TestController的实例,只需public class TestController : GenericGridController<Candidat,int> { public TestController() : base("param","PartialView") { } }

但是,创建一个完整的另一个类只是为了对基类的构造函数参数进行硬编码(或者实际上覆盖2个getter以返回一些硬编码值)有问题至少可以说。

  

我原本希望做这样的事情:

     

类TestController:   GenericGridController(&#34; PARAM&#34;&#34; PartialView&#34;){}

这似乎表明在更深层次上缺乏理解。在创建类的实例时调用构造函数,您不能在new TestController()的基类的声明中提供这样的构造函数参数,因为此时没有创建实例。