【问题标题】:Using custom routes instead of /controller/action/{id}使用自定义路由而不是 /controller/action/{id}
【发布时间】:2014-06-10 12:36:15
【问题描述】:

我必须为已经存在的网站制作虚 URL。要求是:

  • 现有的控制器是一种层次结构,不能以任何方式消失或被覆盖。示例:domain.com/Dog/vanitydomain.com/Cat/vanity
  • 保留现有操作。任何现有操作都必须优先处理,以免该操作的页面被虚 url 踩到。
  • 考虑未来的页面和操作,以满足上述要求(忽略新的虚 url 并执行操作/视图)

迄今为止,我已经尝试了各种路由解决方案,这些解决方案让我拥有 domain.com/vanity,这很好,但营销人员不喜欢,因为公司内有不同的部门。我已经尝试过路由,它将覆盖现有操作并将它们全部视为虚荣(也不可行)。我有一个解决方案,它以编程方式处理所请求的 url 并重定向到实际存在的页面,但这在任何情况下都不可扩展。

到目前为止,我知道虚部分可以被视为操作的参数,以便我可以触发路由(索引)中的默认页面,但到目前为止,这并没有保留结构。

TL;DR:我需要一个解决方案,允许域/控制器/虚荣结构,同时还允许域/控制器/操作

【问题讨论】:

  • 谢谢。没听说过。我正在看它。我必须添加到站点项目中的内容越少越好(它会在几个月内被替换,但营销人员现在想要这个。)我不认为你有这个插件的一句话 TL;DR?
  • 基本上(在配置之后),您将 [Route("an-area-or-string/some-action-or-string")] 添加到您的操作中并调用 www.example.com/an-area-or-string/some-action-or-string 来访问该操作。
  • 再次感谢!这听起来值得一试。如果这符合我的需要,我会发布。即使是这样,我对这个继承的项目做的越少越好。这是一团糟;我敢肯定,如果我改变太多,世界就会终结。
  • 属性路由似乎是你想要的,那么。在我看来,这是一种影响最小的努力。您甚至可以在每个操作中拥有多个 Route 属性。您还可以在控制器上使用路由前缀。

标签: asp.net-mvc asp.net-mvc-4 routing


【解决方案1】:

使用AttributeRouting for MVC4,您可以完成一个可行的解决方案,直到您启动替换项目。它可以让您在保留现有路线的同时添加新的自定义路线,而影响很小。

[Route("my-vanity/is-cool/post/{id}")]
public ActionResult Index(int id)
{
}

重要的部分是记住优先级,因此您编写的路由不会覆盖/被现有路由覆盖。您可以通过属性上的属性在一定程度上控制这一点。下面只是一个示例,它将添加的路由放在整个站点的最后一个优先级。

[Route("my-vanity/is-cool", SitePrecedence = -1)]
public ActionResult Index()
{
}

【讨论】:

  • 这是一个 +1 :)
  • @jgauffin 干杯。我忘记了 WebApi2 内置了它,但由于它使用与 MVC 5 相同的基本库,所以这并不奇怪。 :)
  • 感谢您的解决方案和 TL;DR。 :)
【解决方案2】:

ASP.NET WebApi2 内置了对属性路由的支持。有了它,您可以以任何您喜欢的方式定义 URL(而不是遵循 /controller/action 模式)

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

【讨论】:

  • 我将把它标记为答案,即使它不是我所需要的。这将是技术上正确的答案,但 attributerouting.net 评论为我提供了我在这种情况下需要的确切解决方案:以最少的编码和逻辑更改处理特定的虚 url(该网站是一个被黑掉的烂摊子,几个月后就会消失)作为以及将重新路由分配给任何操作以进行跟踪的能力,无需大惊小怪。然而,这将是我们正在加速启动的替换站点的解决方案。
  • 然后请@J.Steen 提供答案并接受。
  • @MetalPhoenix:Steen 添加了一个答案,请接受那个答案,因为它对你有用。
  • 补充 jgauffin 关于使用现代库的答案:ASP.NET MVC 5 也内置了基于属性的路由。 =)
  • 完成了!我们仍在使用 MVC 4,但出于这个原因,我会看到我们在不久的将来迁移到 5(因为我们整个公司一开始使用这个解决方案就会想要这个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多