如果我不想在URL中显示操作名称,如何路由到具有相同签名的不同操作?

时间:2010-09-04 10:57:23

标签: asp.net-mvc

我有一个控制器测试有以下行动

  1. public ActionResult ABC (string parameter1, string parameter2)

  2. public ActionResult XYZ (string parameter1, string parameter2,string parameter3, string parameter4)

  3. 我添加了以下html.routelinks

    <%= Html.RouteLink("ABC","ABC", new { parameter1 = 100, parameter2 = 200 } )%><br />
    <%= Html.RouteLink("XYZ", "XYZ", new { parameter1 = 1000 , parameter2 = 2000 }) %>
    

    XYZ动作中的最后两个参数是选项,所以我在Html.routelink中省略了它们

     routes.MapRoute("ABC", "Test/{parameter1}{parameter2}", new { controller = "Test", action = "ABC", parameter1= 0,parameter2=0 });
    
    routes.MapRoute("XYZ", "Test/{parameter1}{parameter2}{parameter3}{parameter4}", new { controller = "Test", action = "XYZ", parameter1=0,parameter2=0 ,parameter3=UrlParameter.Optional,parameter4=UrlParameter.Optional});
    

    在上述两个案例中,同样的路线“ABC”被称为尽管我点击了第二个Html.routelink。 有谁能解决这个问题?如何根据路线名称而不是参数数量进行路线?

1 个答案:

答案 0 :(得分:0)

首先,您需要将路由参数与/分开,否则您将收到运行时错误:

routes.MapRoute("ABC", "Test/{parameter1}/{parameter2}", 
    new { 
        controller = "Test", 
        action = "ABC", 
        parameter1 = 0, 
        parameter2 = 0 
    }
);
routes.MapRoute("XYZ", "Test/{parameter1}/{parameter2}/{parameter3}/{parameter4}", 
    new { 
        controller = "Test", 
        action = "XYZ", 
        parameter1 = 0, 
        parameter2 = 0, 
        parameter3 = UrlParameter.Optional, 
        parameter4 = UrlParameter.Optional 
    }
);

然后,当您生成两个链接时,您指定了相同的参数:parameter1parameter2,并且由于您未在路线中指定任何操作部分,因此无法在这两个链接之间消除歧义。路由引擎无法知道要调用的操作,因此它只是选择路由定义中的第一个路由(这就是订单重要的原因)。如果您指定不同的参数,那么它将起作用:

<%= Html.RouteLink("ABC","ABC", new { parameter1 = 100, parameter2 = 200 } )%>
<br />
<%= Html.RouteLink("XYZ", "XYZ", new { parameter3 = 1000 , parameter4 = 2000 }) %>