【问题标题】:Use of rewritten URLs vs direct controller call使用重写的 URL 与直接控制器调用
【发布时间】:2016-10-02 11:24:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc url-rewriting routes asp.net-mvc-routing url-routing


    【解决方案1】:

    阻塞路由的内置方法是使用IgnoreRoute。它会使路由短路,并且总是使路径抛出 404 not found。

    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,可以在任何自定义RouteRouteBase implementation 中使用(作为MvcRouteHandler 的替代品)来制定比这更多的动态忽略规则。

    注意:在路由表中您要忽略的路由之前注册IgnoreRoute 非常重要。

    【讨论】:

    • 好答案。但是,如果您要经常做这种类型的事情,那么使用属性路由可能会更好地为您服务。这样,您就可以完全按照自己的意愿自定义每个操作的路线。
    • @Chris Pratt:如果多个重写的 url 调用相同的控制器操作(例如本地化 url)不是问题吗?
    • 一点也不。您可以将多个路由属性添加到一个动作,甚至参数化部分。例如:[Route("about"), Route("{lang}/about")]。现在,/about//es/about/ 将匹配。从技术上讲,这将允许/home/about/ 之类的东西,但“home”将作为lang 参数的值而不是控制器名称传递。但是,您可以限制 lang 参数来阻止此操作,即 Route("{lang:regex(es|en)}/about")
    • @devlock - 见this question。属性路由会自动阻止将基于约定的备用 URL 用于操作。即使是那些想要的人似乎也找不到办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2016-04-20
    相关资源
    最近更新 更多