【问题标题】:Why isn't FromQuery working in my ASP.Net Core 1.1 controller action为什么 FromQuery 在我的 ASP.Net Core 1.1 控制器操作中不起作用
【发布时间】:2017-12-12 01:31:44
【问题描述】:

我正在开发 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

在带有 GET 动词的 PostMan 中,我得到了服务类型代码的列表,正如预期的那样。但是,如果我尝试添加任何内容作为查询字符串,例如 ...

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

并在我的代码中设置断点

if (string.IsNullOrEmpty(a_query))

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

我在这里错过了什么?

提前感谢您的帮助。

【问题讨论】:

  • 它所期望的字符串变量的名称必须与您发送的相同:a_query -> mailclasscode
  • Terrance - 好的,那么如果我想让用户使用 localhost:5000/api/servicetypecodes?mailclasscode=fclocalhost:5000/api/servicetypecodes?stc=123,这取决于他们是通过 mailclasscode 还是 stc 过滤,那么我需要公共 IActionResult Get ([FromQuery] string mailclasscode, [FromQuery string stc) 对吗?
  • 那行得通。谢谢特伦斯。如果您想发布答案,我很乐意将其标记为正确,以便您获得信用。

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


【解决方案1】:

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

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

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

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

反之亦然。

祝你好运 - 编码愉快。

【讨论】:

  • 如果控制器具有[ApiController] 属性,由于某种原因,这仍然不起作用
  • 我相信你可以指定([FromQuery("varname")])。如果这不起作用,那么很多人都是错的。
  • 这确实有效!圣牛,你是怎么找到的? PS 我正在使用 ASP.NET Core 2.1
  • Microsoft 在 .net-core 上的文档非常好。同样[FromQuery] 也应该可以工作。可能值得为您研究。祝朋友好运。
  • 原来在 2.1 中有一个 bug 会破坏 ApiController 中的 FromQuery,解决方法是覆盖 Namegithub.com/aspnet/Mvc/issues/7712
【解决方案2】:

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

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

或更笼统地说:

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

【讨论】:

    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多