How to override controller actionresult method in

2019-09-20 19:50发布

问题:

There is one method called Index in HomeController. (It is just default template provided by Microsoft)

 public class HomeController : Controller
    {

        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
   }

Now What I want is that... override Index method. something like below.

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();
        }

    }

I don't want any modification in existing method like Open-Closed principle in OO design. Is it possible or not? or Is there another way ?

回答1:

A Controller is a normal C# class, so you have to follow the normal rules of inheritance. If you're trying to override a method in the same class, that's nonsense and will not compile.

public class FooController
{
    public virtual ActionResult Bar()
    {
    }

    // COMPILER ERROR here, there's nothing to override
    public override ActionResult Bar()
    {
    }
}

If you have subclasses of Foo, then you can override, if the method on the base class is marked virtual. (And, if the subclass doesn't override the method, then the method on the base class will get invoked.)

public class FooController
{
    public virtual ActionResult Bar()
    {
        return View();
    }
}

public class Foo1Controller : FooController
{
    public override ActionResult Bar()
    {
        return View();
    }
}

public class Foo2Controller : FooController
{
}

So it works like this:

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