为什么FromQuery不能在我的ASP.Net Core 1.1控制器操作中工作

时间:2017-07-07 16:51:46

标签: asp.net-core-webapi request.querystring asp.net-core-1.1

我正在开发ASP.Net Core 1.1 Web API。我有一个ServiceTypeCode控制器,如下所示;

[Produces("application/json")]
[Route("api/[controller]")]
public class ServiceTypeCodeController : Controller
{ 
    ...
    ...
    ...


    [HttpGet]
    public IActionResult Get([FromQuery] string a_query)
    {
        try
        {
            if (string.IsNullOrEmpty(a_query))
            {
                OperationResult<List<ServiceTypeCode>, string> result = m_bl.GetAllServiceTypeCodes();
                if (result.Success && result.Result.Count > 0)
                {
                    return Ok(JsonConvert.SerializeObject(result.Result));
                }
            } else
            {
                // Deserialize query into dictionary of strings and StringValues 
                var query = QueryHelpers.ParseQuery(a_query.ToLower());

                if (query.TryGetValue("mailclasscode", out var mailClassCode))
                {
                    if (!string.IsNullOrEmpty(mailClassCode))
                    {
                        OperationResult<List<ServiceTypeCode>, string> result = m_bl.GetAllServiceTypeCodes(mailClassCode);
                        if (result.Success && result.Result.Count > 0)
                        {
                            return Ok(JsonConvert.SerializeObject(result.Result));
                        }
                    }
                }
                if (query.TryGetValue("stc", out var stc))
                {
                    if (!string.IsNullOrEmpty(stc))
                    {
                        OperationResult<ServiceTypeCode, string> result = m_bl.GetServiceTypeCode(stc);
                        if (result.Success)
                        {
                            return Ok(JsonConvert.SerializeObject(result.Result));
                        }
                    }
                }
            }
            return NotFound();
        }
        catch (Exception ex)
        {
            string msg = "An exception occurred while trying to get a list of ServiceTypeCodes from the database.";
            m_logger.LogError(1, ex, msg);
            ApiError error = BuildError("Server Error - Exception", "500", "Get", ex, msg);
            return Ok(JsonConvert.SerializeObject(error));
        }

    }

如果我使用网址...

http://localhost:5000/api/servicetypecodes
在PostMan中使用GET动词

,我按预期获得服务类型代码列表。但是,如果我尝试添加任何内容作为查询字符串,例如......

http://localhost:5000/api/servicetypecodes?mailclasscode=fc

并在

的代码中设置断点
if (string.IsNullOrEmpty(a_query))

位置,a_query的值为null而不是预期的“mailclasscode = fc”

我在这里缺少什么?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

.Net核心控制器方法的变量名称必须与您发送的名称相同。

http://localhost:5000/api/servicetypecodes?mailclasscode=fc

如果使用该url传递数据,则控制器方法必须如下所示:

[HttpGet]
public IActionResult Get([FromQuery] string mailclasscode)
{...}

反之亦然。

祝你好运 - 编码愉快。

答案 1 :(得分:0)

您可以让查询字符串名称与方法中的变量名称不同。你必须让.NetCore知道如何在代码中定义它(使用你的变量名):

[HttpGet]
public IActionResult Get([FromQuery(Name = "mailclasscode")] string a_query)
{
   ...
}

或更一般地说:

[HttpGet]
public IActionResult Get([FromQuery(Name = "myQueryStringParamName")] string myCodeParamName)
{
   ...
}