【问题标题】:Url.Action doesnt work with non standard MVC RouteUrl.Action 不适用于非标准 MVC 路由
【发布时间】:2012-12-01 01:47:22
【问题描述】:

我无法使 @Url.Action 与具有非标准路由结构的区域一起工作。

例如,如果我在仪表板区域中注册此路线:

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional }
        );

然后在我的布局视图中我调用:

        @Url.Action("Select", "View", new { area = "Dashboard" })

我得到一个正确的网址:/Dashboard/View/Select

但是,如果我更改路线以包含这样的可选辅助 ID:

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}/{secondaryid}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional, secondaryid = UrlParameter.Optional }
        );

然后对 @Url.Action(...) 的相同调用不会返回任何 url。如果我用真实值指定那些可选参数,如下所示:

        @Url.Action("Select", "View", new { area = "Dashboard", id = 1, secondaryid = 2 })

我确实得到了上帝的返回值:/Dashboard/View/Select/1/2

问题是我在这个领域的一些操作不需要 id 或辅助 id,我希望在没有它们的情况下生成 url。如果我将它们设置为 (int?)null 它仍然不起作用。

我做错了吗?如果我没有在 routeValues 参数中指定它们,Url.Action(...) 不应该返回没有 id 和 secondaryid 标记的 URL 吗?

【问题讨论】:

    标签: c# asp.net-mvc c#-4.0


    【解决方案1】:

    拥有多个可选参数会对您的路线造成一些奇怪的影响。基本上,如果有一组可选参数,路由引擎不能(有麻烦)匹配一个或没有可选参数。欲了解更多信息,请查看此blog post on the same issue

    由于您并不总是需要 id 或辅助 id,因此只需创建几条路线来处理这些情况。

    context.MapRoute(
                "Dashboard_IdAndSecondaryId",
                "Dashboard/{controller}/{action}/{id}/{secondaryid}",
                new { controller = "View", action = "Display"}
            );
    context.MapRoute(
                "Dashboard_default_WithSecondaryId",
                "Dashboard/{controller}/{action}/{secondaryid}",
                new { controller = "View", action = "Display"}
            );
    
    context.MapRoute(
                "Dashboard_default",
                "Dashboard/{controller}/{action}/{id}/",
                new { controller = "View", action = "Display", id = UrlParameter.Optional}
            );
    

    现在,当您只发送一个 Id、一个secondaryId 或两者时,您将拥有匹配的路由。我们可以删除前两个路由中的可选参数声明,因为为了匹配该路由,您必须发送所需的参数。如果不发送所需的参数,您可能只希望匹配最后一条路由。

    当在操作链接中仅发送 Id 或 none 时,最后一个路由是您的默认路由。我相信这个顺序也很有效,记住你希望你的路线从最具体到最不具体,因为它们是按顺序处理的。

    【讨论】:

    • 这行得通,除了我必须将中间路线更改为使用 id 而不是辅助 id,然后将最后一条更改为没有 id 或辅助 id。所以路由匹配是:有 id 和次要 id,只有 id,最后根本没有 id
    • 如果您从不单独发送secondaryId,那么您可能只能制作两条路线。基本上,删除我的第二条路线。然后默认将采用只有 id 或没有参数的路由,清理路由表只是一点点。无论如何,很高兴它对你有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多