2012-05-23 206 views
3

我有一个名为Raportare的控制器,它有两个动作:ReportAReportB。 两者都会根据提供的参数返回一个excel文件。asp.net mvc路由在同一控制器上的不同动作

public ActionResult ReportA(int? month, int? year) 
{ 
... 
} 
public ActionResult ReportB(int? month, int? year) 
{ 
... 
} 

我的Global.asax中有下面这样的路由规则:

routes.MapRoute(
       "ReportA", 
       "{Raportare}/{ReportA}/{month}/{year}", 
       new { controller = "Raportare", action = "ReportA", month = UrlParameter.Optional, year = UrlParameter.Optional}); 

routes.MapRoute(
       "ReportB", 
       "{Raportare}/{ReportB}/{month}/{year}", 
       new { controller = "Raportare", action = "ReportB", month = UrlParameter.Optional, year = UrlParameter.Optional }); 

然而,当我去mysite.com/Raportare/ReportB/5/2012它返回的ReportA文件。 如果我去mysite.com/Raportare/ReportB?month=5 & year = 2012,它可以正常工作。 也许我在路由规则中做了错误的事情,但我无法弄清楚。

回答

3

您不需要为每个操作添加路由 - 它们像模板一样工作,第三个参数只是默认值。

routes.MapRoute(
    "reports", 
    "Raportare/{action}/{month}/{year}", 
    new { 
    controller = "Raportare", 
    action = "ReportA", 
    month = UrlParameter.Optional, 
    year = UrlParameter.Optional 
    } 
); 

将此项放在Global.asax.cs中的默认规则之前,否则默认值可能会先匹配。

然后mysite.com/Raportare/ReportB/5/2012将调用ReportB操作,因为它已在url中指定。

mysite.com/Raportare将调用ReportA,因为它是默认操作。

0

您创建的路线基本相同。这就是为什么匹配请求字符串的第一个成功并且第一个动作被调用的原因。

相关问题