要求解决此问题的最佳方法:
在我的控制器中,我有以下操作
public ActionResult Member(string id){return View();}
同一个控制器中的另一个动作
public ActionResult Archive(string year){return View();}
在我的global.asax
中routes.MapRoute(
"Archive", // Route name
"{controller}/{action}/{year}", // URL with parameters
new { controller = "Home", action = "Index", year = "" } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id="" } // Parameter defaults
);
如果我将此url命名为mysite.com/archive/2009,则此方法有效,因为该操作需要具有名称“year”的参数,并且第一个路由架构适用于此请求。但如果我将此url称为mysite.com/member/john,则会产生此url mysite.com/member?id=john 所以看起来如果我在global.asax中的第一个路由具有相同的结构但是参数名称不同,那么具有正确参数名称的路由将具有正确的URL(mysite.com/archive/2009),但对于另一个则不会。我该如何解决这个问题?我可以更改路由表以期望一个通用参数名称,如“param”,但我需要将操作的所有签名更改为“param”,并且它不是非常具有描述性(param而不是year或param而不是id)。
答案 0 :(得分:1)
试试这个:
routes.MapRoute(
"Archive", // Route name
"Home/Member/{id}", // URL with parameters
new { controller = "Home", action = "Member", id = "" } //
Parameter defaults
);
routes.MapRoute(
"Archive", // Route name
"{controller}/{action}/{year}", // URL with parameters
new { controller = "Home", action = "Index", year = "" } // Parameter defaults
);
您可以在第二个参数中使用文字,它们将充当过滤器。您的路线越具体,您就越需要将其置于路线配置的顶部,路线系统将选择匹配的第一条路线。
这是link更详细的背景信息。自撰写本文以来,一些语法已经改变,但基本规则似乎是最新的。