我目前正在开发一个小型的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 :(得分:7)
您可以查看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();
}
答案 1 :(得分:0)
我希望能够根据请求传递不同的视图,但是它们基本上都使用相同的过程,并且不想为每个视图执行操作。先前的答案似乎不再起作用,所以这是我想出的。这是.Net Core 2.2。
[HttpGet]
[Route("[controller]/ManageAccessView/{name}/{id}",Name = "ManageAccessView")]
[Route("[controller]/ManageAccessUsers/{name}/{id}", Name = "ManageAccessUsers")]
[Route("[controller]/ManageAccessKeys/{name}/{id}", Name = "ManageAccessKeys")]
public async Task<IActionResult> ManageAccessView(int id, string name)
{
var requestedView = this.ControllerContext.ActionDescriptor.AttributeRouteInfo.Name;
return View(requestedView);
}
这将允许您将各个视图作为路线的名称,并使用它们来设置视图。