在ASP MVC 6中为同一控制器或操作分配多个路由

e3bfsja2  于 2023-03-13  发布在  .NET
关注(0)|答案(2)|浏览(211)

问题:

在ASP.NETMVC6应用程序中,是否有办法将两个不同的路由(带参数)分配给同一个控制器?

我试过

我尝试对控制器类和单个操作使用多个route属性,但没有成功。

注:

  • 我正在使用ASP.NET核心1.0 RC1。
    • 我这样做的原因是,我希望API与使用旧URL的旧版本移动的应用程序兼容。*
      示例:
[Produces("application/json")]
[Route("api/v2/Log")]
/// The old route is "api/LogFile" which I want to be still valid for this controller.
public class LogController : Controller {
    [HttpGet("{id}", Name = "download")]
    public IActionResult GetFile([FromRoute] Guid id) 
    {
        // ...
    }
}

在上例中:api/LogFile/{some-guid}是旧路由,api/v2/log/download/{some-guid}是新路由。我需要两个路由调用相同的操作。

nx7onnlm

nx7onnlm1#

在新的RC 1应用程序中,在控制器级别具有2个路由属性可以很好地工作:

[Produces("application/json")]
[Route("api/[controller]")]
[Route("api/old-log")]
public class LogController: Controller
{
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

http://localhost:62058/api/loghttp://localhost:62058/api/old-log都返回了预期的json,我看到的唯一警告是,如果需要生成这些操作之一的url,您可能希望设置属性的name/order属性。
在操作上具有2个属性也可以:

[Produces("application/json")]        
public class LogController : Controller
{
    [Route("api/old-log")]
    [Route("api/[controller]")]
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

然而,当你在控制器层有一个通用路由和一个特定的操作路由时,你需要小心。在这些情况下,控制器层的路由被用作前缀,并被放在url的前面(有一篇关于这个行为的文章here)。这可能会让你得到一个与你期望的不同的url集合,例如:

[Produces("application/json")]
[Route("api/[controller]")]
public class LogController : Controller
{
    [Route("api/old-log")]
    [Route("")]
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

在最后一种情况下,应用程序将侦听的2个路由将是http://localhost:62058/api/loghttp://localhost:62058/api/log/api/old-log,因为api/log作为前缀添加到在操作级别定义的所有路由中。
最后,另一种选择是为新路由使用属性,然后使用启动类中的路由表来提供照顾旧API的特定路由。

k5ifujac

k5ifujac2#

- [RoutePrefix("UrlName")] Public Class Controller: BaseController{
   [Route("{urlKey?}")] public ActionResult Index(string urlKey="") {
   //You can render the view here which has same content return
   View("~/Views/Country/Index.cshtml') } }

相关问题