【问题标题】:MVC ignores route defaults and renders full “/Home/Index” URLs instead of rootMVC 忽略路由默认值并呈现完整的“/Home/Index” URL 而不是 root
【发布时间】:2015-03-18 20:56:56
【问题描述】:

我的 ASP.NET MVC 项目在组合 URL 时似乎忽略了路由默认值。例如,Url.Action("Index", "Home") 返回 /Home/Index/,而它应该只返回 /(我在所有其他 MVC 网站上都看到过)。 使用 URL 没有任何问题,例如通过访问http://myserver/,可以正确找到默认的控制器和动作。

如何解决该行为? (请注意,我发现 questions 询问如何实现这种行为,但似乎没有人遇到这个相反的问题。)

该项目没什么了不起,没有自定义路由处理程序等,而且路由配置非常简单:

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

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

* 之所以存在,是因为某些操作使用任意字符串作为标识符,其中可能包含嵌入的斜杠,并且没有星号,路由与此类 URL 不匹配。)

【问题讨论】:

    标签: asp.net-mvc-routing asp.net-mvc-5.2


    【解决方案1】:

    问题确实出在小星号上。这些catch-all parameters 显然与UrlParameter.Optional 默认值不匹配,并导致URL 始终包含整个路径。

    如果要保持默认行为,同时允许使用 catch-all 参数语法的任意参数,则需要在辅助路由中使用 catch-all 参数

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("LoginHandler");
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "CatchAll",
            url: "{controller}/{action}/{*id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    

    使用此定义,不包含斜杠的简单参数使用第一个路由处理(就像在未指定要使用的确切路由时生成 URL),而带有斜杠的复杂参数回退到第二个路由,并被处理正确的在那里。


    (请注意,这可能只是 MVC 实现中的一个错误:对于包罗万象的参数,MVC 的 ParsedRoute.IsParameterRequired 返回 null 作为默认参数值,然后针对路由提供的 UrlParameter.Optional 进行测试defaults, 并且发现是不同的。因此,您可以将路由定义更改为使用id = null default 而不是id = UrlParameter.Optional,而不是添加辅助路由,它似乎也可以工作,但它可能有不需要的一面效果,我猜。我也不确定这种行为是故意的,还是只是一个错误。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      相关资源
      最近更新 更多