You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CreatedAtRoute/Action路由匹配失败:租户-公司父子资源创建问题

问题描述

我已经搜索过类似问题但未找到匹配结果,目前正在尝试创建隶属于Tenant(父资源)的Company(子资源),并在响应中返回该资源的URI。

相关代码配置

API控制器路由配置

[ApiController]
[Route("api/tenants/{tenantId}/companies")]
public class CompanyController : ControllerBase

GetCompanyById方法配置

[HttpGet("{companyId:guid}")]
[ActionName(nameof(GetCompany))]
public async Task<IActionResult> GetCompany(Guid tenantId, Guid companyId)
{
    var result = await _sender.Send(new GetCompanyQuery(tenantId, companyId));

    return Ok(result);
}

创建Company的方法

[HttpPost]
public async Task<IActionResult> CreateCompany(Guid tenantId, CreateCompanyRequest request)
{
    var company = new CreateCompanyCommand(
        request.Name,
        request.NavraeName,
        request.NavraeStoreNo,
        request.AddressStreet,
        request.AddressUnit,
        request.AddressCity,
        request.AddressState,
        request.AddressZip,
        request.Phone,
        request.Email,
        tenantId);

    var result = await _sender.Send(company);

    if (result.IsFailure)
        return BadRequest(result.Error);

    return CreatedAtRoute(
        routeName: nameof(GetCompany),
        routeValues: new {tenantId, companyId = result.Value}, 
        value: result);
}

我尝试使用CreatedAtAction时也出现错误,错误截图如下:
CreatedAtAction错误


解决方案

问题核心是路由名称匹配错误:CreatedAtRoute依赖的是路由的名称标识,而非Action的名称。你之前用ActionName仅修改了Action的调用名称,但未给目标Get路由设置对应的命名标识。

步骤1:给Get路由添加名称属性

修改GetCompany方法的HttpGet属性,通过Name参数指定路由名称,同时可以移除多余的ActionName属性(因为Action本身名称就是GetCompany):

[HttpGet("{companyId:guid}", Name = nameof(GetCompany))]
public async Task<IActionResult> GetCompany(Guid tenantId, Guid companyId)
{
    var result = await _sender.Send(new GetCompanyQuery(tenantId, companyId));

    return Ok(result);
}

步骤2:验证CreatedAtRoute调用

现在你的CreatedAtRoute调用已经正确传递了tenantId和companyId两个路由参数,修改后会自动匹配到目标路由,返回正确的资源URI。

若使用CreatedAtAction的正确写法

如果想改用CreatedAtAction,同一控制器下直接指定Action名称和路由参数即可:

return CreatedAtAction(nameof(GetCompany), new { tenantId, companyId = result.Value }, result);

内容的提问来源于stack exchange,提问作者Kent Hub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:55:22