2016-02-09 27 views
18

問:分配多條路線在ASP MVC相同的控制器或者動作6

有什麼辦法來分配在ASP.NET MVC應用程序6兩種不同的路線(帶參數)相同的控制器?

我想:

我嘗試使用多個路由屬性控制器類,也給個人行爲,沒有工作。

注:

  • 我使用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}是新的路由。我需要兩條路線調用相同的操作。

回答

26

有2路在控制器級別屬性在新RC1應用程序工作正常:

[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,您可能需要設置這些屬性的名稱/順序屬性。

有上行動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路,你的應用程序將在最後一種情況下聽會因爲api/loghttp://localhost:62058/api/loghttp://localhost:62058/api/log/api/old-log添加爲前綴的所有在行動級別定義的路線。

最後,另一種選擇是爲新路線使用屬性,然後使用啓動類中的路線表來提供處理舊API的特定路線。

+0

謝謝,我嘗試了這個工作!我在示例中添加了更多信息,以便您可以看到問題。 –

+0

我現在看到了,因爲url的初始部分不同我想你已經從控制器中刪除了屬性並在動作中使用了2個屬性 –

+0

有一點需要注意的是,你不能爲[Http *,Name =「」]當有多個路由到一個動作,如你在例子中提到的'[HttpGet(「{id}」,Name =「download」)]'。 – Dhanuka777

相關問題