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

这是我的方法

        [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,并且我的过滤器不起作用

最佳答案

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

我做了一个PoC,而建造者给了我这个警告:


  严重性代码说明项目文件行抑制状态
  
  警告类型'FilterClass'的MVC1004属性具有与以下名称相同的名称
  参数“过滤器”。这可能会导致错误的模型绑定。
  考虑重命名参数或使用模型绑定属性
  覆盖
  名称。


您有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#代码不变,并在您的请求上更改querystring名称,添加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;否则,请使用选项3。否则,选项1会更好。

关于c# - 昂首阔步发送空值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59213615/

10-16 13:35