ASP.NET MVC:如何覆盖父Controller方法

时间:2013-11-26 05:19:46

标签: asp.net asp.net-mvc-3 asp.net-mvc-4

假设我有很多Controllers,而且很多此Controllers共享Action。分享这些常见Actions以消除重复代码的最佳方式是什么?

我知道的一种方法是将这些常见的Actions重构为父abstract Controller,就像这样......

public abstract class BaseController : Controller {

    //handles common help page for all controllers
    public ActionResult Help(string helpTopic) {
        ..open help page..
        return View(page);
    }
}

//now Controller1 and Controller2 has the help page for free!
public class Controller1: BaseController {
}

public class Controller2: BaseController {
}

但是如果我试图覆盖任何子控制器中的Help动作,那么......

//customized help page for Controller1
public class Controller1: BaseController {
    public new ActionResult Help(string helpTopic) {
        .. my own customized help page..
        return View(page);
    }
}

我会收到错误 The current request for action 'Help' on controller type 'Controller1' is ambiguous between....

那么如何覆盖父控制器方法?

1 个答案:

答案 0 :(得分:0)

我成功覆盖父控制器方法的做法是将方法标记为virtual并在子控制器方法中使用override关键字,如此...

public abstract class BaseController : Controller {

    //handles common help page for all controllers
    public virtual ActionResult Help(string helpTopic) {
        ..open help page..
        return View(page);
    }
}

//Controller1 has a customized help page
public class Controller1: BaseController {
    public override ActionResult Help(string helpTopic) {
        .. my own customized help page..
        return View(page);
    }
}

//Controller2 has help page for free!
public class Controller2: BaseController {
}