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

Asp.net mvc 使用自定义路由而不是/controller/action/{id},asp.net-mvc,asp.net-mvc-4,routing,Asp.net Mvc,Asp.net Mvc 4,Routing,我必须使虚荣的网址已经存在的网站。这些要求是: 现有的控制器是一种层次结构,不能消失或以任何方式重写。示例:domain.com/Dog/vantage和domain.com/Cat/vantage 保留现有操作。任何现有操作都必须具有优先级,以便该操作的页面不会被url踩踏 将未来的页面和操作考虑在内,以满足上述要求(忽略一个新的虚荣url,改为执行操作/视图) 到目前为止,我已经尝试了各种路由解决方案,允许我拥有domain.com/vantity,这很好,但营销人员不喜欢,因为公司内的

我必须使虚荣的网址已经存在的网站。这些要求是:

  • 现有的控制器是一种层次结构,不能消失或以任何方式重写。示例:domain.com/Dog/vantage和domain.com/Cat/vantage
  • 保留现有操作。任何现有操作都必须具有优先级,以便该操作的页面不会被url踩踏
  • 将未来的页面和操作考虑在内,以满足上述要求(忽略一个新的虚荣url,改为执行操作/视图)
到目前为止,我已经尝试了各种路由解决方案,允许我拥有domain.com/vantity,这很好,但营销人员不喜欢,因为公司内的部门不同。我尝试过路由,它将覆盖现有的操作,并将它们都视为虚荣(也不可行)。我有一个适当的解决方案,可以通过编程方式处理请求的url,并重定向到实际存在的页面,但这在任何方面都是不可伸缩的

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


TL;DR:我需要一个解决方案,该解决方案允许域/控制器/虚荣结构,同时也允许域/控制器/操作。ASP.NET WebApi2内置了对属性路由的支持。有了它,你可以用任何你喜欢的方式定义URL(而不是遵循
/controller/action
模式)

使用您可以完成一个有效的解决方案,直到您启动更换项目。它将允许您在添加新的自定义路由的同时保留现有路由,并且影响很小

[Route("my-vanity/is-cool/post/{id}")]
public ActionResult Index(int id)
{
}
重要的一点是记住优先级,这样您就可以编写不会被现有路由覆盖/覆盖的路由。您可以使用属性上的属性在一定程度上控制此操作。下面是一个示例,它将把添加的路线放在整个站点的最后一个优先级

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

试过了吗?谢谢。我没听说过。我现在正在看。我需要添加到站点项目中的内容越少越好(几个月后它就会被替换,但是市场营销人员现在就想要这个了。)我不认为你有一句话TL;此插件的DR?基本上(配置后),您将
[路由(“区域或字符串/某些操作或字符串”)]
添加到您的操作中,并调用www.example.com/an-area-or-string/some-action-or-string访问该操作。再次感谢!这听起来值得一看。我会张贴,如果这是我需要的。即使是这样,我对这个继承下来的项目做的越少越好。这是一堆乱七八糟的东西;我敢肯定,如果我在这方面做了太多的改变,世界将会终结。那么,属性路由似乎就是你想要的。在我看来,这是一个最小的影响努力。每个操作甚至可以有多个路由属性。您也可以在控制器上使用路由前缀。我将把它标记为一个答案,尽管它不完全是我需要的。这在技术上是正确的答案,但attributerouting.net评论为我提供了这种情况所需的确切解决方案:用最少的编码和逻辑更改来处理特定的虚荣URL(该网站乱七八糟,几个月后就会消失)以及将重新路由分配给任何操作的能力,以便无需担心地进行跟踪。然而,这将是我们即将启动的替换站点中的解决方案。然后请@J.Steen提供答案并接受该答案。@metalfenix:Steen已经添加了答案,请接受这一点,因为它对您很有用。要补充jgauffin关于使用现代库的回答:ASP.NET MVC 5也内置了基于属性的路由完成了!我们仍在使用MVC4,但我会考虑在不久的将来将MVC4迁移到5,原因就在于此(因为我们整个公司在开始使用此解决方案时都会希望这样),这里有一个+1:)@jgauffin干杯。我忘了WebApi2内置了它,但由于它使用了与MVC5相同的基本库,这并不奇怪感谢您的解决方案和TL;博士:)