如何在mvc3中覆盖控制器actionresult方法?

时间:2012-09-27 05:24:04

标签: c# asp.net-mvc-3

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原则。 有可能吗?还是有另一种方式吗?

1 个答案:

答案 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