首页 > 解决方案 > 大摇大摆发送空值

问题描述

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

这是我的方法

        [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; }
    }

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

标签: c#getfiltering

解决方案


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

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

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

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

您有 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会更好。


推荐阅读