在我的工作中,我必须解决一个URL重写问题。我必须使用URL作为模板:
{controller}/{action}-{id}
而不是
{controller}/{action}/{id}
因此处理后的网址应如下所示:
myController/myAction-128
其中128是参数
我的路线图:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "NewRoute", // Route name
url: "{controller}/{action}-{id}/{extId}", // URL with parameters
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, extId = UrlParameter.Optional } // Parameter defaults
);
}
控制器代码:
[HttpGet]
public ActionResult DocumentDetails(int? id)
{
if (doc.HasValue)
{
...
}
}
此路线未提供任何成功结果。我仍然有404错误。当我使用/而不是“ - ”时一切正常,但我的JS View环境将无效。
我有什么办法可以解决这个问题吗?感谢所有帮助。
答案 0 :(得分:4)
路线的评估顺序与您定义的顺序相同,因此请确保遵守相同的顺序。同时为id
添加约束(例如,作为数字)将有助于路由引擎消除您的路由歧义。更不用说在你的例子中你已经使id令牌成为可选的当然是不可能的,只有路线的最后部分可以是可选的。
所以:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "NewRoute",
url: "{controller}/{action}-{id}/{extId}",
defaults: new { controller = "Home", action = "Index", extId = UrlParameter.Optional },
new { id = @"\d+" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
答案 1 :(得分:0)
我认为您的请求正在由第一个路由规则进行处理,然后action-id被视为整个操作而未被发现。
在默认路线前设置NewRoute。只需移动代码即可。