【问题标题】:ASP.NET MVC RouterASP.NET MVC 路由器
【发布时间】:2013-07-10 19:58:45
【问题描述】:

我有这条路线:

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

            routes.MapRoute(
                "Funcionario",
                "{funcionario}",
                new { controller = "Funcionario", action = "Index", funcionario = UrlParameter.Optional },
                new string[] { "Route.Controllers" }
            );

            routes.MapRoute(
                "Servico",
                "{funcionario}/{servico}",
                new { controller = "Funcionario", action = "Servico", funcionario = UrlParameter.Optional, servico = UrlParameter.Optional },
                new string[] { "Route.Controllers" }
            );

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = @"\d+" }, // Parameter defaults
                new string[] { "Route.Controllers" }
            );            
        }

但我无法访问我的主页/索引。例如:

工作

http://mydomain.com/pablo

http://mydomain.com/pablo/cozinha

http://mydomain.com/home/index/0

不工作

http://mydomain.com/

http://mydomain.com/home/index

【问题讨论】:

    标签: asp.net-mvc-4 routes


    【解决方案1】:

    所有定义的路由都是通用的。

    1. http://mydomain.com/pablo 将匹配第一条路由

    2. http://mydomain.com/pablo/cozinha 将匹配第二条路由

    3. http://mydomain.com/会匹配第一条路由(所以首页不会显示)

    4. http://mydomain.com/home/index 将匹配第二条路由。 (所以主页不会显示)

    应该按照从特定到通用的顺序定义路由。例如您可以将路线更改为,

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                "Servico",
                "Func/{funcionario}/{servico}",
                new { controller = "Funcionario", action = "Servico", funcionario = UrlParameter.Optional, servico = UrlParameter.Optional },
                new string[] { "Route.Controllers" }
            );
    
            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = @"\d+" }, // Parameter defaults
                new string[] { "Route.Controllers" }
            );            
        }
    

    所以,你的请求会是这样的,

    1. http://mydomain.com/Func/pablo
    2. http://mydomain.com/Func/pablo/cozinha
    3. http://mydomain.com/
    4. http://mydomain.com/home/index

    所以,路由应该仔细声明,这样请求就不会匹配任何不需要的路由

    【讨论】:

    • 好的!这样,传递“/Func”就可以了。但我不想使用控制器名称。我正在考虑验证何时是控制器、动作或参数。也许在 BaseController 中。但我不知道该怎么做。
    • 那么您将无法区分请求。所以请求不会匹配适当的路由。
    • 您需要一些区分路线的标识符。它可以是任何东西,不必是控制器名称
    • 我在想...如果 when 只有一个参数并且是控制器的名称,我可以强制重定向到“mycontroller/index”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多