HomeController中有一个名为Index的方法。 (它只是Microsoft提供的默认模板)
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
现在我想要的是...覆盖索引方法。如下所示。
public partial class HomeController : Controller
{
public virtual ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
public override ActionResult Index()
{
ViewBag.Message = "Override Index";
return View();
}
}
我不希望在OO设计中对现有方法进行任何修改,例如Open-Closed原则。 有可能吗?还是有另一种方式吗?
答案 0 :(得分:1)
Controller
是普通的C#类,因此您必须遵循正常的继承规则。如果你试图覆盖同一个类中的方法,那是无意义的,不会编译。
public class FooController
{
public virtual ActionResult Bar()
{
}
// COMPILER ERROR here, there's nothing to override
public override ActionResult Bar()
{
}
}
如果你有Foo
的子类,那么你可以覆盖,如果基类上的方法被标记为virtual
。 (并且,如果子类不重写该方法,则将调用基类上的方法。)
public class FooController
{
public virtual ActionResult Bar()
{
return View();
}
}
public class Foo1Controller : FooController
{
public override ActionResult Bar()
{
return View();
}
}
public class Foo2Controller : FooController
{
}
所以它的工作原理如下:
Foo1 foo1 = new Foo1();
foo1.Bar(); // here the overridden Bar method in Foo1 gets called
Foo2 foo2 = new Foo2();
foo2.Bar(); // here the base Bar method in Foo gets called