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
。お役に立てれば。