【问题标题】:Swagger sending null value大摇大摆发送空值
【发布时间】:2019-12-06 12:55:23
【问题描述】:

我正在尝试将过滤器应用到我的方法中,但在尝试使用大摇大摆发送参数时遇到问题...

这是我的方法

        [HttpGet]
        [Route("anyRoute")]
        [ProducesResponseType(typeof(List<ViewModel>), (int)HttpStatusCode.OK)]
        [ProducesResponseType((int)HttpStatusCode.NoContent)]
        public async Task<IActionResult> GetMehod([FromQuery] Filter filter)
        {
            var result = await _service.GetApproved(filter);

            if (result.Count() == 0)
                return NoContent();

            return Ok(result);
       }

这是我的过滤器

public class Filter
    {
        public string Filter { get; set; }
    }

当我尝试调试时,我的参数为空,我的过滤器不起作用

【问题讨论】:

  • 我认为您需要提供更多信息。您的请求是什么样的?
  • 请同时添加您的查询。似乎它无法解析它。
  • 当你提出我的要求时,你的意思是http://localhost:5564/api/v1/TimeEntries/toBill?Filter=MockedName
  • @RavelSbrissaOkada 那么,您想将字符串(“MockedName”)映射到对象吗?尝试更改您的方法签名以采用字符串参数(例如 GetMethod([FromQuery]string filter)。
  • @RavelSbrissaOkada 您在请求中传递的参数“MockedName”只是一个字符串。现在,框架可以通过您的请求/代码来理解您实际上是指将其映射到类的某个属性。

标签: c# get filtering


【解决方案1】:

这里的问题是您的 Filter 参数与其属性之一具有相同的名称。而当你发出这样的请求时:http://localhost:5564/api/v1/TimeEntries/toBill?Filter=MockedNameASP.Net 不知道你是想绑定参数过滤器还是参数过滤器的属性。

我创建了一个 PoC,构建器给了我这个警告:

严重性代码描述项目文件行抑制状态

警告 MVC1004 类型“FilterClass”的属性与 参数“过滤器”。这可能会导致不正确的模型绑定。 考虑重命名参数或使用模型绑定属性 覆盖 名字。

你有 3 个选项来解决它:

1) 更改参数名称并发出完全相同的请求:

public async Task<IActionResult> GetMehod([FromQuery] Filter anyName)
{
    var result = await _service.GetApproved(anyName.Filter);

    if (result.Count() == 0)
        return NoContent();

        return Ok(result);
}

请求网址:http://localhost:5564/api/v1/TimeEntries/toBill?filter=MockedName

2) 保持 C# 代码不变,并根据您的请求更改查询字符串名称,添加 parameterName.PropertyName=value。

请求网址:http://localhost:5564/api/v1/TimeEntries/toBill?filter.Filter=MockedName

3) 由于您只需要此字符串,因此建议您更改操作的参数类型。

public async Task<IActionResult> GetMehod([FromQuery] string filter)
{
    var result = await _service.GetApproved(filter);

    if (result.Count() == 0)
        return NoContent();

        return Ok(result);
}

如果您的 Filter 类只有一个属性,我建议您使用选项 3;否则选项1会更好。

【讨论】:

  • 我该怎么做?
  • 对不起。你怎么能做什么?
  • 更改我的请求以指定我的对象的属性
  • 在查询字符串上使用参数名称和属性名称。在您的情况下,您的查询字符串应该是 filter.Filter 像这样:localhost:5564/api/v1/TimeEntries/…
  • 如果它解决了您的问题,如果您可以将答案标记为正确,我很高兴。将来也会帮助其他有同样问题的用户。
猜你喜欢
  • 2018-11-29
  • 2014-07-19
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多