ASP.NET MVC 3 URL.Action映射到错误的Route

时间:2012-03-28 01:45:30

标签: asp.net asp.net-mvc-3 url-routing url.action

我在我的应用中配置了这两条路线:

routes.MapRoute(
             "PromotionModel-test", // Route name
             "testSpecifications", // URL with parameters
             new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults
         );

routes.MapRoute(
          "", // Route name
          "{controller}/{action}/{id}", // URL with parameters
          new { groupID = 0, controller = "Home", action = "List", id = UrlParameter.Optional, CatID = 0 },
          new {controller = @"\w{3,}"}
        );

当我打电话

 @Url.Action("Brochure", "test")

它生成的网址是“/ testSpecifications”而不是“test / Brochure”。当我明确地做

@Url.Action("Brochure", "test", new { modelName = string.Empty })

然后它将产生正确的结果。

我知道有段变量重用方案,但它在这里如何应用?场景背后的逻辑是什么?

更新

我想在这里实现的是简单地生成上面的URL,而不必显式设置任何参数值。

想象一下,您开始开发一个网站,它不需要任何参数。稍后,您已经注意到可能需要添加几个附加参数,在上面的示例中,添加的新参数是“modelName”。然后,您的客户端请求映射“testSpecifications”以映射到上面的特定页面。

我们绝对不希望返回更新所有Url.Action来为每个Url.Action设置默认值。你会采取什么方法来解决这个问题?

希望这有意义......

2 个答案:

答案 0 :(得分:3)

事实上,逻辑非常简单。路线优先于声明顺序。由于"Url.Action("Brochure" "test")与第一条路线匹配,因此它很自然就是MVC使用的路径。

在第二种情况下,你明确地设置了modelName,这意味着它不再匹配第一条路线。这将保留默认路由。

<强>更新 您可以将url'/ testSpecifications'映射到具有默认值的操作,就像您上面一样:

routes.MapRoute(
      "PromotionModel-test", // Route name
      "testSpecifications", // URL with parameters
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 

但是,如果您在任何时候想要使用modelName的不同值生成此网址,则必须将此参数绑定到网址:

routes.MapRoute(
     "PromotionModel-test", // Route name
     "testSpecifications/{modelName}", // URL with parameters
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 
    );

使用上述路径,您可以直接链接到'/ testSpecifications',在这种情况下将使用modelName的默认值,或者您可以明确地设置modelName的值:'/ testSpecifications/SomeModelName'.

答案 1 :(得分:0)

正如上面提到的Kasper,使用下面的路线,“modelName”中的值被用作“默认”值而不是要检查的约束。

routes.MapRoute(
             "PromotionModel-test", // Route name
             "testSpecifications", // URL with parameters
             new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults
         );

因此解决问题的关键是使其成为约束而不仅仅是默认值。以下是解决我的问题的正确路由配置。

当看到它正确映射传入请求(localhost / testSpecifications)和url生成(Url.Action(“宣传册,测试”)时,我感到很惊讶......

 routes.MapRoute(
                 "PromotionModel-test", // Route name
                 "testSpecifications", // URL with parameters
                 new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 },
               new { modelName="test"}
             );