1

这是我想要的网址格式:/product-24-hid-35wh4-cx-dsgtx

如何将此 URL 映射到我的操作方法:

public ActionResult Product(int id)

这是我的路由代码:

  routes.MapRoute(
       "ProductDetail",
       "product-{id}-{name}",
        new { controller = "product", action = "detail", name = UrlParameter.Optional },
        new string[] { "SphereLight.Controllers" }
  );

但是,它不起作用;我使用了 phil haack 的 routedebugger 来测试这条路线,结果如下:

 Key    Value
 name   dsgtx 
 id         24-hid-35wh4-cx 
 controller product 
 action detail 

只有id = 24是正确的。

总之,我需要一条路线来匹配:

   /product-24
   /product-24-
   /product-24-hid-35wh4-cx-dsgtx
4

1 回答 1

2

尝试在 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. 希望这可以帮助。

于 2012-05-17T08:32:40.423 回答