【问题标题】:Attribute Routing with Default Route带默认路由的属性路由
【发布时间】:2018-01-26 17:54:17
【问题描述】:

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

~/ ~/首页 ~/首页/索引

HomeController.Index,这条路线:

~/Home/错误

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") 和其他组合,但仍然无法匹配:

/首页/索引

【问题讨论】:

  • 仅供参考 - 将相同的内容放在多个 URL 上而不使用 a canonical tag 对 SEO 不利。使用/Home/Home/Index 的301 重定向将所有请求和书签重定向到/ 的更好选择。
  • @NightOwl888 好评,但这是针对内部网络应用程序

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


【解决方案1】:

空路由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?}");

【讨论】:

  • 获取错误:错误:属性路由“Home/{action:index}”不能包含名为“{action}”的参数。在路由模板中使用“[action]”插入值“Index”。
  • 你是对的。只能在属性路由中的操作上提供默认值。请参阅我的更新答案。
  • 我试图以简洁的方式使用属性路由重新创建默认的常规路由功能,而无需大量重复
  • 它们的工作方式不同,因此很难从另一个中重新创建一个。但我的回答让你无需重复就可以做到。
【解决方案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(){}

 }

【讨论】:

  • 确实如此,但我试图避免在任何地方重复动作名称......啊,似乎应该更简单
猜你喜欢
  • 2014-01-28
  • 2013-10-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多