Rider 无法解析 nameof(OtherClass.Method)

Posted

技术标签:

【中文标题】Rider 无法解析 nameof(OtherClass.Method)【英文标题】:Rider can't resolve nameof(OtherClass.Method) 【发布时间】:2020-06-06 06:43:22 【问题描述】:

重现步骤:

创建一个新的 .NET Core Web API 项目

转到生成的WeatherForecastController,将类更新为

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

    [HttpGet("id")]
    public async Task<ActionResult<object>> GetById(int id)
    
        return Ok(null);
    

创建第二个控制器

[ApiController]
[Route("[controller]")]
public class FooController : ControllerBase

    [HttpPost]
    public async Task<ActionResult<object>> Create()
    
        return CreatedAtAction(nameof(WeatherForecastController.GetById), new  id = 1 , null);
    

构建项目,应该没问题

Rider 在Create 路线出现错误

无法解析操作“GetById”

如你所见

这很烦人,因为 IDE 也在项目资源管理器中提供了它

虽然代码运行良好。那么我的代码很糟糕,我应该改进它吗?是bug吗?

【问题讨论】:

【参考方案1】:

使用了错误的CreatedAtAction 重载。

它无法解析动作GetById,因为使用的重载期望动作属于当前控制器(即FooController)。

如果预期的操作属于另一个控制器,则需要包含控制器名称。

FooController:

//...

[HttpPost]
public ActionResult<object> Create() 
    return CreatedAtAction(
        actionName: "GetById",
        controllerName: "WeatherForecast", //Note removal of `Controller` suffix
        routeValues: new  id = 1 , 
        value: null);


//...

参考ControllerBase.CreatedAtAction Method

【讨论】:

感谢您的回复。这并没有解决问题,即使使用像 CreatedAtAction("GetProductByIdAsync", "ProductsController", new id = 1 , product); 这样的硬编码字符串,Rider 说它无法解析方法和控制器名称。 喜欢cdn.discordapp.com/attachments/165027329981153280/…左右cdn.discordapp.com/attachments/165027329981153280/… @Question3r 这些链接对我不起作用。我收到拒绝访问消息 @Question3r 基于最后一张图片,controllerName 应该是Products(没有Controller 后缀) 好的,所以这似乎工作return CreatedAtAction(nameof(ProductsController.GetProductByIdAsync), "Products", new id = 1 , product); 有什么办法我不必硬编码“产品”?就像通过nameof(ProductsController).RemoveSuffix()删除后缀一样@

以上是关于Rider 无法解析 nameof(OtherClass.Method)的主要内容,如果未能解决你的问题,请参考以下文章

c# nameof

c# nameof

c# nameof

Rider 无法检测 Ubuntu 上的 .NET 核心安装

Rider 无法在 mac 上恢复 dotnet 核心包

JetBrains Rider 无法检测到单元测试