C# 当控制器位于单独的类库中时重写MVC控制器

C# 当控制器位于单独的类库中时重写MVC控制器,c#,asp.net-mvc,C#,Asp.net Mvc,这是我的VS解决方案: Core Library - contains Controllers Project A - references Core Project B - references Core 这两个项目都有基于参考核心库的路由。但是,我想根据哪个项目(又称“站点”)调用该函数来覆盖某些控制器函数。我尝试创建从核心库控制器继承的ProjectB控制器,将核心函数设置为虚拟,并将ProjectB控制器函数设置为“覆盖”。然而,项目B控制器从未被调用 这可能吗?如何让项目覆盖核心控制

这是我的VS解决方案:

Core Library - contains Controllers
Project A - references Core
Project B - references Core
这两个项目都有基于参考核心库的路由。但是,我想根据哪个项目(又称“站点”)调用该函数来覆盖某些控制器函数。我尝试创建从核心库控制器继承的ProjectB控制器,将核心函数设置为虚拟,并将ProjectB控制器函数设置为“覆盖”。然而,项目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();
    }

}
公共类BaseController:控制器
{
public StateLevelViewModel GetStateLevelLandingResults(字符串状态,int级别)
{
var数据=GetStateCityBreakdown(StateAbPrev,级别);
}
公共虚拟列表GetStateCityBreakdown(字符串stateAbRev,int级别)
{
返回db.Database.SqlQuery(“GetCountsByStateAndCity@state,@level”,
新的SqlParameter(“state”,stateAbbrev),
新的SqlParameter(“level”,level)).ToList();
}
}
公共类BaseController:XYZ.Controllers.BaseController
{
公共覆盖列表GetStateCityBreakdown(字符串stateAbRev,int-level)
{
返回db.Database.SqlQuery(“GetCountsByStateAndCityForPartnership@state,@level,@partner”,
新的SqlParameter(“state”,stateAbbrev),
新的SqlParameter(“级别”,级别),
新的SqlParameter(“partner”,2)).ToList();
}
}

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

您所描述的解决方案应该可以工作,下面是MSDN上关于原因的较长解释:

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

A:B

而且
B
有一个虚拟方法

公共虚拟foo()

并且
A
具有覆盖方法

public override foo()

然后,即使变量被声明为类型
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]


根据评论进一步澄清了一些句子

在你的帖子顶部,你说“不应该”,你的意思是应该吗?哦,我的意思是他描述的问题不可能。他所描述的实现应该可以工作,我会编辑这篇文章。谢谢!所以,在某个地方我需要一个旧控制器的实例,而不是仅仅从一个控制器继承到另一个控制器?我将在原始帖子中发布我的代码。我已经更新了我的原始帖子,以显示我在控制器类中所做的工作,这似乎复制了本文中的解决方案。不确定除了MVC之外为什么它不工作。请尝试将自定义BaseController重命名为其他名称,然后更改路由以引用其他名称。原因是,路由使用一个字符串作为控制器名称,因此如果它们是相同的名称,那么路由可能只引用基本库的控制器版本?如果重写被实例化为
B controller=new B()
,而不是我的示例中的
B controller=new A()
,则重写对您没有帮助。您是否使用依赖项注入容器?如果是,是否始终检查是否有任何已定义的控制器注册指向基本控制器?当您点击控制器时,其他操作方法(非重写或特定于子控制器)是否被正确调用/调用?无依赖注入。