将数组传递给MVC操作方法(Web API)时出现ajax请求时出错

时间:2017-08-07 06:11:47

标签: jquery json ajax asp.net-mvc asp.net-web-api

在MVC / ASP.NET中工作,我希望从我的视图中调用Web API控制器的操作方法(此控制器称为“TreinreisController”)。为此,我在视图中有以下javascript / jQuery函数:

function sendAjaxRequest(httpMethod, controller, callback, url, reqData) {
         $.ajax("/api/" + controller + (url ? "/" + url : ""), {
               type: httpMethod,
               contentType: "application/json",
               dataType: "json",
               traditional: true,
               data: JSON.stringify(reqData),
               success: callback,
               error: function (x, y, z) {
                   var err = eval("(" + x.responseText + ")");
                   alert(err.Message);
               },
               data: reqData
         });
}

每当我想使用JSON对控制器动作方法进行ajax调用时,我都会调用此函数。如果我只在数据对象中放置一个字符串(param1),这就完美地工作了,如下所示:

        var param1 = "some_string";
        sendAjaxRequest("POST", "treinreis", function (data) {
                           alert("Succes!");
                        },
        "action_method_name",
        {param1: param1}
        );

但是当我添加一个整数数组作为第二个参数(param2)时会出错,如下所示:

        var param1 = "some_string";
        var param2 = [8, 17];
        sendAjaxRequest("POST", "treinreis", function (data) {
                               alert("Succes!");
                            },
        "action_method_name",
        {param1: param1, param2: param2}
        );

如果是2个参数,其中一个是数组,则永远不会达到操作方法。不幸的是,我从函数sendAjaxRequest中的错误回调函数中的警报中获得的错误消息只说:“发生了错误”,这不太有用。

我已经检查过数组在函数sendAjaxRequest中完好无损,事实上就是这种情况。所以问题似乎与JSON序列化有关,或者可能是路由(虽然后者看起来很奇怪,因为相同的路由只能与param1完美配合)。

控制器中的操作方法TreinreisController就像这样(我显示的是带有两个参数的版本;只需要param1的那个当然应该相应地修改):

[System.Web.Http.HttpPost]   
[System.Web.Http.Route("api/treinreis/action_method_name")]
public void MyActionMethod([FromBody] string param1, 
                           [FromBody] int[] param2) {
    // do calculations, whatever
}

我注意到action方法中的参数与视图中data-object中使用的名称相同(即param1和param2)。

我做错了什么。为什么只使用param1,但是当我添加param2时却没有?

非常感谢,我将能在几个小时内回来查看。

1 个答案:

答案 0 :(得分:1)

你不能这样做!根据设计,允许从消息体中读取最多一个参数。因此,这不起作用。

此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

您可以使用一些变通方法来完成这项工作:

  1. 在Conjunction
  2. 中同时使用POST QueryString参数
  3. 使用包含两个参数的单个Object
  4. 使用JObject从对象中解析多个属性值
  5. https://weblog.west-wind.com/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods