ASPNET核心路由

时间:2020-10-02 11:04:19

标签: asp.net-core blazor

我已经解决了错误的路由设置问题,该问题已得到修复,但是我不完全理解为什么该修复程序有效。

    [ApiController]
    [Route("api/[controller]")
    public class DetailsController : ControllerBase
    {
        [HttpGet]
        [Route("api/[controller]/{transactNo}")]
        public IActionResult Detail(int transactNo)
        {
        ...

当我打电话给api/details/123时,直到从类中删除了Route属性之前,我都找不到路由。所以我猜他们在冲突,但是为什么呢?

3 个答案:

答案 0 :(得分:2)

在控制器上放置RouteAttribute不同于在操作上放置https://localhost:44338/api/details/api/details/1 ^^^^^^^^^^^ ^^^^^^^^^^^^^ from controller ^ from action

  • 在控制器上,它定义了所有属于该控制器的动作将以其为前缀的路由
  • 在动作上,它定义了要与前缀路由串联的路由

这意味着当您同时添加两个属性时,便可以在以下位置调用操作:

const data = [{'group':'1', 'name':'name1'},
{'group':'2', 'name':'name2'},
{'group':'2', 'name':'name3'},
,{'group':'1', 'name':'name4'}]; 

const groups = data .map( i => i.group);
const uniqueGroups = Array.from(new Set(groups));
const groupes = uniqueGroups.map( c => { 
            return  { group:c, names:[]};
        } ); 

group.forEach( g => { 
            groupes.find( gg => gg.group === g.group).names.push(g.name);
});

答案 1 :(得分:1)

端点的路由是控制器的路由api/[controller]与操作的路由api/[controller]/{transactNo}串联。

在您的情况下,端点的路由为api/[controller]/api/[controller]/{transactNo}

您需要简化操作路线,如:

[HttpGet]
[Route("{transactNo}")]
public IActionResult Detail(int transactNo)
{

如果只想从操作中重新定义端点的路由,则操作的路由必须以/开头:

[HttpGet]
[Route("/api/[controller]/{transactNo}")]
public IActionResult Detail(int transactNo)
{

答案 2 :(得分:1)

您可以将活动的路由属性替换为Product,并将控制器上的路由属性更改为[HttpGet("{transactNo}")]

[Route("api/[controller]/[action]")]

现在您可以调用以下网址:[ApiController] [Route("api/[controller]/[action]")] public class DetailsController : ControllerBase { [HttpGet("{transactNo}")] public IActionResult Detail(int transactNo) { ... } }