0

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

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")

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

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

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

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

更新

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

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

我们绝对不想回去更新所有 Url.Action 来为它们中的每一个设置默认值。你会采取什么方法来处理这个问题?

希望这有意义....

4

2 回答 2

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}); 

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

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

使用上述路由,您可以仅链接到“/testSpecifications”,在这种情况下将使用模型名称的默认值,或者您可以明确设置模型名称的值:“/testSpecifications/SomeModelName”。

于 2012-03-28T01:54:34.630 回答
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(“Brochure,Test”)正确映射时,我感到很惊讶。

 routes.MapRoute(
                 "PromotionModel-test", // Route name
                 "testSpecifications", // URL with parameters
                 new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 },
               new { modelName="test"}
             );
于 2012-03-28T22:57:17.557 回答