使用重写的 URL 与直接调用控制器

Use of rewritten URLs vs direct controller call

是否有一种简单的包罗万象的方法来确保只有重写的 URL 才能调用控制器?

例如,如果我们有一个URL www.somesite.com/about指向控制器"Shared"中的动作"About",是否可以确保任何对 www.somesite.com/shared/about 的请求以重写的 URL 结束,在本例中为 www.somesite.com/about?

换句话说,用户不应该只键入 /controller/action 而不会被重定向到重写的 URL.

但是,我们不想主动检查和重定向,而是希望 MVC 有一些内置功能。我在这些方面发现的唯一建议是 ChildActionOnly 和 HttpPost 属性,但它们似乎不是答案(正常链接不起作用)。

如前所述,我们正在寻找简单的、或多或少内置的东西 - 如果它不存在,那就这样吧...

内置的屏蔽路由的方法是使用IgnoreRoute。它会使路由短路,并始终使路径抛出 404 未找到。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Ignore /Home/About
        routes.IgnoreRoute("Home/About");

        // Register /About
        routes.MapRoute(
            name: "About",
            url: "About",
            defaults: new { controller = "Home", action = "About" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

请注意,在幕后,它使用 StopRoutingHandler,可以在任何自定义 Route 中使用(作为 MvcRouteHandler 的替代)制定比这更多的动态忽略规则。

NOTE: It is extremely important that IgnoreRoute is registered before the route you want to ignore in the route table.