【问题标题】:$http Call to Web API 2 Not Passing Parameter$http 调用 Web API 2 不传递参数
【发布时间】:2015-12-09 16:12:56
【问题描述】:

这是我的 C# WebAPI2 控制器,它被击中了:

[HttpGet, Route("bycaseidlist/{idArray}")]
public async Task<IHttpActionResult> GetByCaseIdList([FromUri] List<int> idArray)

这是电话:

var idArray = [4,4,2,4];
var url = baseUrl + 'api/cases/bycaseidlist/' + idArray ;

$http.get(url)

问题是 API 没有得到数组,它得到了……这个:

换句话说,一个具有一个值的数组:0。为什么会发生这种情况?我如何解决它?它似乎与this answer 一致,但它不起作用。我应该在体内传递吗?我觉得我错过了一些明显的东西。

【问题讨论】:

  • 你试过没有 [FromUri] 吗?
  • 使用浏览器中的开发工具查看正在发送的实际 URL。我的猜测是你必须序列化数组。查看此答案中的发送请求,看看您的 url 是否与它相似:stackoverflow.com/questions/9981330/…
  • @AmmarHamidou:我没有,但我是在 url 中发送对象,所以这是必要的。另一种方法是来自 body,它是除了简单类型或类似的东西之外的任何东西的默认值。谢谢大家的回答。
  • 问题似乎出在您的 javascript 中。即使使用 [FromUri] 属性,当我尝试使用上述语法时,url 的格式也无法正确序列化。您的查询字符串需要采用 ?numbers=1&numbers=2&numbers=3 或 ?numbers[]=1&numbers[]=2&numbers[]=3 格式

标签: javascript c# angularjs asp.net-web-api2


【解决方案1】:

Get ActionMethods 可以将对象作为参数。但是,默认行为是在参数不是 .net 原语时查看正文。为了强制 action 方法使用模型绑定器从请求中读取对象数据,可以使用 [FromUri] 或 [ModelBinder] 属性修饰参数。 (请注意,还有其他方法可以做到这一点,包括执行参数绑定规则,但这对于您在此处尝试完成的任务可能有点过分了)。这是一个解决您提出的原始问题的实现。

 <script type="text/javascript">
    var ajaxCall = function (myArry) {
        var ajaxProperties = {};
        ajaxProperties.url = "/api/Mul/Mutiply";
        ajaxProperties.type = "Get";
        ajaxProperties.data = {};
        ajaxProperties.data.numbers = myArry;
        ajaxProperties.contentType = "application/json";
        console.log(ajaxProperties);
        ajaxProperties.success = function (data) {
            console.log(data);
        }
        ajaxProperties.error = function (jqXHR) {
            console.log(jqXHR);
        };
        $.ajax(ajaxProperties);

    };
    var getData = function (e) {

        var myArry = new Array();
        myArry.push($('input[name=num1').val());
        myArry.push($('input[name=num2').val());

        ajaxCall(myArry);
        return false;
    };
     </script>

控制器

    [HttpGet]
    public IHttpActionResult Multiply([FromUri] int[] numbers)
    {
        int result = 0;
        if(numbers.Length > 0)
        {
            result = 1;
            foreach (int i in numbers)
            {
                result = result * i;
            }
        }
        return Ok(result);
    }
}

【讨论】:

  • 泰。一旦我测试,我会回来接受。我仍然认为在正文中发送 http 请求对象并特别是获取不起作用的请求是有问题的,但这可能是一个仅限角度的限制。将检查详细信息。
  • 你可能是对的。 jquery 得到了微软的点头,看起来 get 中请求的默认序列化在您的实现中格式不正确。但是,有几本书、文章、网站显示将数据从请求的查询字符串序列化为对象、列表或数组。
  • 对我来说已经足够好了。我知道如何序列化,但是将复杂的对象放在正文中似乎更直观。不管怎样,你回答了我的问题。
【解决方案2】:

我认为我的错误是使用 Get。我可能记错了(有人确认你是否知道),但 Get 可能无法将对象作为参数。无论如何,我将方法更改为 POST,然后更改要在请求正文中发送的参数,而不是 url。现在可以了。这是工作代码:

[HttpPost, Route("bycaseidlist")]
public async Task<IHttpActionResult> PostByCaseIdList([FromBody] int[] sqlCaseIdArray)

以及调用本身:

                    function runDbCall(url, sqlCaseIdArray){
                        return $http({
                            method: 'POST',
                            url: url,
                            data: sqlCaseIdArray
                        });
                    }

                    runDbCall(url, sqlCaseIdArray)

当我弄清楚问题是否是 Get 无法获取对象时,我会回到这个问题,但我认为它可以在 url 中,而不是在正文中......需要澄清。如果有人仅在该部分上发布答案,我会接受,因为这可能是问题的根源。

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多