具有默认路由的属性路由

时间:2018-01-26 17:54:18

标签: c# asp.net-core asp.net-core-mvc asp.net-core-mvc-2.0 asp.net-core-routing

使用基于属性的路由我想匹配以下路由:

~/
~/Home
~/Home/Index

HomeController.Index ,以及此路线:

~/Home/Error

HomeController.Error 。这是我的配置:

[Route("[controller]/[action]")]
public class HomeController : Controller {
    [HttpGet, Route(""), Route("~/")]
    public IActionResult Index() {
        return View();
    }

    [HttpGet]
    public IActionResult Error() {
        return View();
    }
}

我尝试添加Route("[action]")Route("Index")和其他组合,但仍无法匹配:

/Home/Index

2 个答案:

答案 0 :(得分:8)

空路由Route("")与控制器上的路由相结合,使用Route("/")覆盖它而不是与之合并:

[Route("[controller]/[action]")]
public class HomeController : Controller {

    [HttpGet]
    [Route("/")]
    [Route("/[controller]")]
    public IActionResult Index() {
        return View();
    }

    [HttpGet]
    public IActionResult Error() {
        return View();
    }
}

或者,你可以删除控制器上的/[action],这样可以更容易(不需要覆盖),但是你必须在每个动作上定义一个路径。

我假设您有意使用属性路由而不是传统路由,因此上述答案就是您所需要的。但是,如果假设错误,可以通过简单的传统路由轻松实现:

routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");

答案 1 :(得分:2)

[Route("[controller]")]
   public class HomeController : Controller
   {
      [Route("")]     // Matches 'Home'
      [Route("Index")] // Matches 'Home/Index'
      public IActionResult Index(){}

      [Route("Error")] // Matches 'Home/Error'
      public IActionResult Error(){}

 }