URL路由参数名称,顺序

时间:2010-02-23 20:02:20

标签: asp.net-mvc url-routing

要求解决此问题的最佳方法:

在我的控制器中,我有以下操作

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

1 个答案:

答案 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更详细的背景信息。自撰写本文以来,一些语法已经改变,但基本规则似乎是最新的。

相关问题