Why isn't FromQuery working in my ASP.Net Core 1.1 controller action

EiEiGuy picture EiEiGuy · Jul 7, 2017 · Viewed 12.3k times · Source

I am working on an ASP.Net Core 1.1 web API. I have a ServiceTypeCode controller as shown below;

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

    }

If I use the url ...

http://localhost:5000/api/servicetypecodes

in PostMan with the GET verb, I get the list of service type codes, as expected. However, If I try to add anything as a query string, such as ...

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

and set a breakpoint in my code at the

if (string.IsNullOrEmpty(a_query))

location, the value of a_query is null instead of the expected "mailclasscode=fc"

What am I missing here?

Thanks in advance for any help.

Answer

Terrance00 picture Terrance00 · Jul 9, 2017

The .Net Core Controller Method's variable names must be the same as what you are sending.

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

If using that url to pass data the controller method will have to look like this:

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

Or vice versa.

Good luck - happy coding.