【问题标题】:Why are these routes conflicting?为什么这些路线会发生冲突?
【发布时间】:2021-01-09 19:30:21
【问题描述】:

我有一个控制器和两个方法,它们都有不同的路由。 .NET 抱怨这两条路线存在冲突。

这些是方法:

   [Route("portal/")]
    [HttpGet("{*slug}")]
    public IActionResult Portal(string slug)
    {
      var session = HttpContext.Get<LoggableEntities>(_context);
      ViewData["CurrentUser"] = session?.User;
      ViewData["CurrentAdmin"] = session?.Admin;

      ViewData["id"] = _context.Application.First().Id;
      ViewData["slug"] = slug;
      ViewData["Page"] = "Home/Index";
      ViewData["ProjectName"] = _projectNameOptions.Value;
      ViewData["app"] = "portal";
      return View();
    }


    [Route("")]
    [HttpGet("{*slug}")]
    public IActionResult PublicSite(string slug)
    {
      var session = HttpContext.Get<LoggableEntities>(_context);
      ViewData["CurrentUser"] = session?.User;
      ViewData["CurrentAdmin"] = session?.Admin;

      ViewData["id"] = _context.Application.First().Id;
      ViewData["slug"] = slug;
      ViewData["Page"] = "Home/Index";
      ViewData["ProjectName"] = _projectNameOptions.Value;
      ViewData["app"] = "public_site";
      return View();
    }

这是我得到的错误:

AmbiguousActionException:匹配多个动作。以下操作匹配路由数据并满足所有约束:MyProject.Controllers.HomeController.Portal (MyProject) MyProject.Controllers.HomeController.PublicSite (MyProject)

【问题讨论】:

  • 问题在于门户的 slug 需要是 [HttpGet("portal/{*slug}")] 而不是 [HttpGet("{*slug}")]

标签: c# .net asp.net-mvc routes


【解决方案1】:

请查看documentation of HttpGetAttribute。传递给HttpGet 属性的字符串参数是路由模板。因此,当您通过 {*slug} 哟您的两个 Actions 时,它们会覆盖 Route 属性并发生冲突。因此,您可以删除 [Route] 属性并将您的代码更改为如下内容:

[HttpGet("portal/{*slug}"), Order = 0]
// GET: portal/abc-def-123
public IActionResult Portal(string slug)
{
  var session = HttpContext.Get<LoggableEntities>(_context);
  ViewData["CurrentUser"] = session?.User;
  ViewData["CurrentAdmin"] = session?.Admin;

  ViewData["id"] = _context.Application.First().Id;
  ViewData["slug"] = slug;
  ViewData["Page"] = "Home/Index";
  ViewData["ProjectName"] = _projectNameOptions.Value;
  ViewData["app"] = "portal";
  return View();
}


[HttpGet("{*slug}", , Order = 1)]
public IActionResult PublicSite(string slug)
{
  var session = HttpContext.Get<LoggableEntities>(_context);
  ViewData["CurrentUser"] = session?.User;
  ViewData["CurrentAdmin"] = session?.Admin;

  ViewData["id"] = _context.Application.First().Id;
  ViewData["slug"] = slug;
  ViewData["Page"] = "Home/Index";
  ViewData["ProjectName"] = _projectNameOptions.Value;
  ViewData["app"] = "public_site";
  return View();
}

由于{*slug} 路由包含portal/{*slug} 路由,Order 属性确保前一个路由在后一个路由之前检查。

【讨论】:

    【解决方案2】:

    尝试使用 HttpGet 属性中的路由

    喜欢这个

    [HttpGet, Route("portal/")]
    

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2016-04-07
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多