使用自定义路由而不是/ controller / action / {id}

时间:2014-06-10 12:36:15

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

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

  • 现有的控制器是一种分层结构,不能以任何方式消失或被覆盖。示例: domain.com/Dog/vanity domain.com/Cat/vanity
  • 保持现有行动。任何现有的操作都必须优先,以便该操作的页面不会被虚荣网址踩踏。
  • 考虑将来的页面和操作,以满足上述要求(忽略新的虚荣网址并执行操作/视图)

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

到目前为止,我知道可以将虚荣部分视为操作的参数,这样我就可以触发路径中的默认页面(索引),但到目前为止,这并不保留结构。

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

2 个答案:

答案 0 :(得分:4)

使用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 :(得分:1)

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

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