2017-09-22 78 views
1

我已经设置了以下的路径,在我的MVC项目:MVC路由投掷404

  routes.MapRoute(
       "Product", 
       "product-{pathname}-{productId}", 
       new { controller = "Product", action = "ProductPage" }); 

这工作得很好像product-test-title-1234网址,但如果pathname位的URL包含product-,404被抛出 - 是有一种方法可以允许像product-test-product-title-1234这样的网址?

古怪,如果我把第二个产品只是产品ID之前(如product-test-title-product-12345),那么路径工程和页面显示,其他任何地方,它抛出一个404

更新

我认为问题可能在于URL的两部分与路由匹配这一事实,所以我想我的问题是如何确保路由表明第一个产品必须位于url的开头(并计算任何更多的实例产品作为路径名的一部分)。

进一步测试后,我发现,而不是去到产品的控制器,这个网址去我包罗万象的路线:{*pathname} - 不知道为什么会这样

+0

为什么用'-'(连字符)? - 代替'product/{pathname}/{productId}'生成'../ product/test/product-title-1234' –

+0

@StephenMuecke不幸的是它是当前网站的路径,我们需要保持它不变所以我们不必为所有的旧网址实施301个永久物(否则当新的网站替换旧的时候,我们将在seo上受到惩罚)。另外这也是市场部门想要的 - 我也会用通常的'/'结构,但显然浅的url结构对于seo排名也更好 – Pete

回答

0

有没有一种方法可以让一个网址像产品测试产品标题1234?

是的,但你所定义的路径URL包括3个破折号和URL你是匹配包含4您可以使用像匹配的网址:

 routes.MapRoute(
      "Product", 
      "product-{pathname}-product-{productId}", 
      new { controller = "Product", action = "ProductPage" }); 

但是这可能不是什么你正在寻找。这里的问题是,当您使用-作为路由占位符之间的分隔符时,占位符本身不能包含-,否则Route类会感到困惑。

但是,如果您下降到较低级别并继承RouteBase,则路由非常灵活,这可能更符合您所寻找的内容。然后,您可以将所需的任何自定义逻辑/ URL添加到路由中,即使组织结构不完善,也可以完全匹配旧的URL方案。

请参阅:Multiple levels in MVC custom routing

+0

嗨,Nightowl,谢谢你的回答,不幸的是这不会工作,因为它不会没有真正解决任何问题 - 在产品ID旁边有产品的路径已经运行(参见上面问题的最后一句),而且我不想包含第二个路径名(即,我不想要类似'product- {路径名} -product- {pathname1} - {productId}'),因为我需要整个路径名位以从无头cms系统获取页面数据 – Pete

+0

如果您希望它转到CMS系统,请参阅我提供的链接。使用'MapRoute'不适用于每种情况,但是如果您继承'RouteBase',则可以按照您喜欢的任何方式从字面上对路由进行编程。 – NightOwl888