$http 调用 Web API 2 未传递参数

$http Call to Web API 2 Not Passing Parameter

这是我的 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。为什么会这样?我如何解决它?好像是in-line和this answer,但是不行。我应该在 body 中传递它吗?我觉得我错过了一些明显的东西。

我认为我的错误在于使用 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 中,只是不在 body 中...需要澄清。如果有人仅针对该部分发布答案,我会接受,因为这可能是问题的根源。

Get ActionMethods 可以将对象作为参数。但是,默认行为是在参数不是 .net 原语时查看主体。为了强制操作方法使用模型绑定器从请求中读取对象数据,可以使用 [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);
    }
}