使用Action的路由映射时丢失参数值?

时间:2014-06-08 14:43:36

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 routes

我在IIS Express上使用MVC3,ASP.NET 4.5,C#,razor和开发。

我有一条路线:

routes.MapRoute(
"Item_Delete",
"Item/Delete/{id}/{a}/{b}/{c}",
new { controller = "Item", action = "Delete"}
);

我有一个Action方法:

public ActionResult Delete(int id, int a = 0, int b= 0, int c = 0) 

当我注释掉路线图时,我有:

http://myserver/Item/Delete/1301?a=8&b=1&c=0

上面的查询字符串正确地返回a,b和c的值,即

id=1301, a=8, b=1, c=0

但是,如果路由处于活动状态,我会将URL转换为:

http://myserver/Item/Delete/1301/8/1/0

但是我得到了

id=1301, a=0, b=0, c=0 
行动方法中的

让我很困惑。

也许我错误地设置了我的路线?它似乎是在我正确格式化url时触发。 Action方法似乎无法从中提取正确的参数值。

感谢您的帮助。

EDIT1

问题的原因是由于文件中较早的另一个路线映射的干扰:

routes.MapRoute("Suppliers", "{controller}/{action}/{id}/{d}/{e}/{f}", new { id = UrlParameter.Optional }, new string[] { "MyApp.MVC3.ED.Controllers" });

我能看到的唯一相似之处是:

a)Generic {controller}。

b)通用{action}

c)相同{id}参数标记

d)相同数量的参数,即(d},{e},{f},虽然名称不同。所以不应该干涉?

我现在的解决方案是将路线放在上面的路线之前,但我很想知道上述干扰的原因。太像是"魔术"为了我的安慰!!!

EDIT2

在进一步的研究中,似乎如果你有{controller} / {action}类型patsh太早就会导致混乱,因为看起来MVC只会在{controller}上匹配而不管参数如何。所以我的解决方案是对我所有更具体的路线使用以下格式:

MyController/MyAction/{id}..., new{controller="MyController","MyAction"}

似乎有点啰嗦,但这似乎是编写我的路线唯一可预测的方式。

1 个答案:

答案 0 :(得分:1)

你可以尝试一下。

以这种方式写路线

routes.MapLocalizedRoute("ItemDel", "s/{id}/{a}/{b}/{c}",
 new { controller = "Item", action = "Delete", a =    UrlParameter.Optional,b=UrlParameter.Optional,c=UrlParameter.Optional },
   new { id = @"\d+", a = @"\d+", b = @"\d+", c = @"\d+" },
  new[] { "Nop.Web.Controllers" });

并从控制器中调用它

return RedirectToRoute("ItemDel", new
                {
                    id =1301,
                    a=8, 
                    b= 1,
                    c=0
                });