在适用的情况下覆盖 MVC 路由,而不继承控制器



假设我有一个控制器FooController它有一堆操作方法。我想覆盖其中一些方法,但没有一个方法被标记为virtual,我不想更改FooController的代码。

所以我实现了一个CustomFooController(不是从FooController继承的(,并编写了我想要的方法的新版本。

现在我想先路由到CustomFooController,如果那里没有操作,我想默认为 FooController .我已经设置了这个路由配置来覆盖路由:

routes.MapRoute(
    "customFoo",
    "foo/{action}",
    new { controller = "CustomFoo", action = UrlParameter.Optional }
);

下面是一些示例定义:

public class FooController : Controller
{
    public ActionResult Bar { ... }
    public ActionResult Baz { ... }
}
public class CustomFooController : Controller
{
    public ActionResult Bar { ... }
}

因此,在访问/Foo/Bar时,我们应该点击CustomFooController.Bar(),在访问/Foo/Baz时,我们应该点击FooController.Baz(),因为Baz()没有在CustomFooController中实现。

但是我得到"找不到资源",我明白为什么,但我可以在不修改FooController的情况下以某种方式解决它吗?

您可能想要查看 HandleUnknownAction(((请参阅 msdn 参考页(。

当请求与控制器匹配时,将调用它,但在该控制器中找不到具有指定操作名称的方法。

因此,您可以在 CustomFooController 中重写该方法,以重定向到 FooController 中的相应操作(甚至根据您对请求相关数据的自定义检查,甚至重定向到其他控制器(。

重定向可以使用重定向到操作((完成(请参阅 msdn 参考页(

我想

我自己找到了一个简洁的解决方案。由于我不想修改我正在扩展的另一个应用程序(并依赖于更新(的FooController和一堆其他控制器,因此我决定在我的启动RouteConfig中使用来自System.Web.Mvc.RouteCollectionAttributeRoutingExtensions的扩展方法MapMvcAttributeRoutes(),以便首先与路由属性匹配,例如我的CustomFooController,它优先于传统路由。

为了安全起见:HandleUnknownAction(( 仅在 CustomFooController 中实现。您不必修改 FooController(或其他控制器(。

最新更新