我在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"}
似乎有点啰嗦,但这似乎是编写我的路线唯一可预测的方式。
答案 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
});