2016-09-21 31 views
3

我正在研究一个小型的ASP.NET MVC项目。该项目几个月前发布。但是现在应该对可用性和SEO的原因进行更改。我决定使用属性路由来创建干净的URL。分配给一个方法的多个路由,如何确定哪个路由被调用?

目前产品页面被称为:

hostname.tld /控制器/ GetArticle/1234

我定义了一个新的路线是这样的:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)] 
public ActionResult GetArticle(int id, string title = null) { 
    // Logic 
} 

一切正常,但由于向后兼容性和搜索引擎优化的原因,旧的路线应该仍然可用。并将HTTP状态码301重定向到新的URL。

我听说有可能多个路由分配到一个动作,就像这样:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)] 
[Route("Controller/GetArticle/{id:int}", Name = "GetArticle_Old", Order = 1)] 
public ActionResult GetArticle(int id, string title = null) { 
    // Logic 
} 

但我不知道这是否是一个很好的解决方案或如何确定哪条路线被称为?

+0

您正在使用哪个版本的MVC?您可能通过'this.ControllerContext.RouteData'获取路线信息。 –

+0

ASP.NET MVC 4.5.2,所以我认为MVC 5,多个Route标签在早期版本上不被支持,据我所知。谢谢你,我会检查一下! –

+0

我问过,因为如果你使用的是Core MVC,你需要使用依赖注入来获得相当于'ControllerContext'我相信。 –

回答

5

您可以查看ControllerContext.RouteData以确定在使用多个路线执行一个操作时使用哪条路线。

public const string MultiARoute = "multiA/{routesuffix}"; 
public const string MultiBRoute = "multiB/subB/{routesuffix}"; 

[Route(MultiARoute)] 
[Route(MultiBRoute)] 
public ActionResult MultiRoute(string routeSuffix) 
{ 

    var route = this.ControllerContext.RouteData.Route as Route; 
    string whatAmI = string.Empty; 

    if (route.Url == MultiARoute) 
    { 
     whatAmI = "A"; 
    } 
    else 
    { 
     whatAmI = "B"; 
    } 
    return View(); 
} 
+0

谢谢,这解决了我的问题! –

相关问题