昂首阔步发送空值

时间:2019-12-06 12:55:23

标签: c# get filtering

我正在尝试将过滤器应用到我的方法中,但是在尝试大范围发送参数时遇到了麻烦...

这是我的方法

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

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

1 个答案:

答案 0 :(得分:3)

这里的问题是您的Filter参数与其属性之一具有相同的名称。当您发出这样的请求时:http://localhost:5564/api/v1/TimeEntries/toBill?Filter=MockedName ASP.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会更好。