这是我的VS解决方案:
Core Library - contains Controllers
Project A - references Core
Project B - references Core
两个项目都基于引用的核心库进行路由。但是,我想根据哪个项目(a.k.a。“site”)调用该函数来覆盖某些Controller函数。我尝试创建继承自Core Library Controller的Project B Controller,使Core函数成为虚拟,并将Project B Controller函数设置为“覆盖”。但是,项目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:继承控制器只是被忽略了。问题是项目根本不会识别控制器。
答案 0 :(得分:0)
您描述的解决方案应该有效,这里有关于MSDN原因的更长解释:
C# inheritance, the virtual, override and new keywords
基本上,它取决于实例声明的类型。例如,如果
A : B
和B
有一个虚拟方法
public virtual 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]
进一步澄清了每条评论的一些句子