【问题标题】:ASP.NET MVC Routes Mapping issueASP.NET MVC 路由映射问题
【发布时间】:2011-04-10 08:29:16
【问题描述】:

我正在努力在 asp.net mvc 2 中生成出站 url。这是场景。

控制器:移动控制器 行动:索引() 查看:Index.aspx

现在我想要将多个 url 映射到具有不同参数 (locationId) 值的同一控制器 (MoveController) 和操作 (Index)

例如

  • url -> RouteData
  • /Production/ -> 移动/索引/1
  • /Installation/ -> 移动/索引/2
  • /Move/3/ -> 移动/索引/3

我的映射如下所示:

 public static void RegisterRoutesTo(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new
        {
            favicon = @"(.*/)?favicon.ico(/.*)?"
        });

        routes.MapRoute(
           null,                                              // Route name
           "Production/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Installation/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Move/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            }  // Parameter defaults
        );
    }

现在要在我的母版页菜单中生成出站 url,我正在做类似 ethis 的事情

<%= Html.ActionLink("Production", "Index", "Move", new{locationId = 1}, null)%>
<%= Html.ActionLink("Installation", "Index", "Move", new{locationId = 2}, null)%>

但以上生成

  • /生产/1
  • /生产/2

这是正确的,但我如何告诉它生成

  • /Production/当locationId =1时
  • /安装/当 locationId = 2

有什么想法吗?

等待,

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 url url-routing asp.net-mvc-routing


    【解决方案1】:

    远射,但绝对值得一试,因为您上面的路线并没有表达您想要的:

    routes.MapRoute(
       null,                                              // Route name
       "Production/",                           // URL with parameters
       new
       {
           controller = "Move",
           action = "Index",
           locationId = 1
       }
    

    );

    routes.MapRoute(
       null,                                              // Route name
       "Installation/",                           // URL with parameters
       new
       {
           controller = "Move",
           action = "Index",
           locationId = 2
       }
    

    );

    【讨论】:

    • 我不知道的是,不一定要在 url 中定义 {parameters}。我一直认为参数需要在url中定义。
    【解决方案2】:

    您是正确的,生产和安装路线完全相同。我只是不知道如何区分它们,因为它们都采用相同的参数 {locationId} 但具有不同的值。如您所见,我提供了不同的默认值,但这只是一个默认值,因此我尝试对它们施加约束

    routes.MapRoute(
                   null,                                              // Route name
                   "Production/{locationId}",                           // URL with parameters
                   new
                   {
                       controller = "Move",
                       action = "Index",
                       locationId = 1
                   }
                   ,  // Parameter defaults
                   new
                   {
                       locationId = @"1"
                   }// constraint for Production url
               );
    
                routes.MapRoute(
                   null,                                              // Route name
                   "Installation/{locationId}",                           // URL with parameters
                   new
                   {
                       controller = "Move",
                       action = "Index",
                       locationId = 2
                   }
                   ,  // Parameter defaults
                   new
                   {
                       locationId = @"2"
                   }// constraint for Production url
               );
    

    这可行,但后来我意识到在定义 Html.ActionLink 时为参数提供 null 值

    <%= Html.ActionLink("Installation", "Index", "Move", null, null)%>
    

    它会生成 Production/ url,它应该作为订单中的第一个。

    我不知道的是,不需要在 url 中定义 {parameters}。我一直认为参数需要在url中定义。

    感谢大家的帮助

    【讨论】:

    • 很好地抓住了 null,没有意识到它会导致这种情况。
    【解决方案3】:

    提供的 ActionLink 帮助程序扩展不会这样做。您需要编写一个新的自定义 ActionLink 方法,该方法将根据您的需要有条件地呈现。

    【讨论】:

    • 嗨,戴夫,您对 eglasius 的回应和我的回应有何看法?
    • @nabeel:如果 eglasius 的答案有效,那对我来说看起来不错。我的印象是 ActionLink 需要是动态的,但事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2011-11-11
    • 2010-09-05
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2013-11-13
    • 2011-11-30
    相关资源
    最近更新 更多