2

这是我的 VS 解决方案:

Core Library - contains Controllers
Project A - references Core
Project B - references Core

这两个项目都有基于引用的核心库的路由。但是,我想根据哪个项目(又名“站点”)正在调用该函数来覆盖某些控制器函数。我已经尝试创建从核心库控制器继承的项目 B 控制器,使核心功能虚拟并将项目 B 控制器功能设置为“覆盖”。然而,项目 B 控制器甚至从未被调用过。

这可能吗?如何让项目覆盖核心控制器功能?

更新:帖子根据下面的评论进行了更新,但仍然不确定为什么这在 MVC 中不起作用。

这是项目 B 中控制器的代码:

public class BaseController : Controller
{

    public StateLevelViewModel GetStateLevelLandingResults(string State, int level)
    {

        var data = GetStateCityBreakdown(stateAbbrev, level);

    }
    public virtual List<StateCityBreakdownModel> GetStateCityBreakdown(string stateAbbrev, int level)
    {
           return db.Database.SqlQuery<StateCityBreakdownModel>("GetCountsByStateAndCity @state, @level",
                new SqlParameter("state", stateAbbrev),
                new SqlParameter("level", level)).ToList();

    }



}

public class BaseController : XYZ.Controllers.BaseController
{

    public override List<StateCityBreakdownModel> GetStateCityBreakdown(string stateAbbrev, int level)
    {
        return db.Database.SqlQuery<StateCityBreakdownModel>("GetCountsByStateAndCityForPartnership @state, @level, @partner",
        new SqlParameter("state", stateAbbrev),
        new SqlParameter("level", level),
        new SqlParameter("partner", 2)).ToList();
    }

}

更新 2:继承控制器完全被忽略。问题是该项目根本无法识别控制器。

4

1 回答 1

1

您描述的解决方案应该可以工作,这是 MSDN 上关于为什么会这样的更长解释:

C# 继承、virtual、override 和 new 关键字

基本上,它取决于实例被声明为什么类型。例如,如果

A : B

并且B有一个虚方法

public virtual foo()

并且A有覆盖方法

public override foo()

那么即使一个变量被声明为 type B,但实际上是 , 的一个实例A,它A的方法也会被调用。

B someInstance = new A(); // implicit cast, this is fine since A : B

someInstance.foo() // call's A's version of foo, even though declared as type B
                   //   due to virtual on B and override on A

因此,如果您将基本控制器的方法声明为virtual并且派生类的方法具有override关键字,那么无论对派生类实例的引用如何,都应该正确解析为您的自定义方法。也许你在某个地方错过了一步?

[编辑]

如果您需要另一双眼睛来诊断正在发生的事情,您的库中的一些代码示例会有所帮助。

[编辑 2]

进一步澄清了每条评论的一些句子

于 2013-08-29T22:15:37.727 回答