尝试在 MapRoute 中添加约束:
routes.MapRoute(
"ProductDetail",
"product-{id}-{name}",
new { controller = "product", action = "detail", name = UrlParameter.Optional },
new { id = @"\d+" }, // <-- change it for @"[^-]+", if it can be non-digit
new string[] { "SphereLight.Controllers" }
);
更新:
终于明白了。
主要问题是您不能使用包含相同分隔符的参数。例如,上面的示例适用于/product-24-nm
,但不适用于product-24-nm-smth
。
所以,让我们试试这个解决方案:
我已经在默认路由上做了,你可以按照自己的方式
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new MyRouteHandler()
).RouteHandler = new MyRouteHandler();
实施MyRouteHandler
:
public class MyRouteHandler : MvcRouteHandler
{
private static readonly Regex ProductPattern = new Regex(@"product\-(\d+)\-?(.*)");
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var match = ProductPattern.Match(requestContext.RouteData.Values["controller"].ToString());
if (match.Length > 0)
{
requestContext.RouteData.Values["controller"] = "Home";
requestContext.RouteData.Values["action"] = "Detail";
requestContext.RouteData.Values["id"] = match.Groups[1].Value;
requestContext.RouteData.Values["name"] = match.Groups[2].Value;
}
return base.GetHttpHandler(requestContext);
}
}
因此,主要思想是检查值是否与我们product-id-name
在处理程序中的模式匹配,而不是尝试在MapRoute
. 希望这可以帮助。