在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时却没有?
非常感谢,我将能在几个小时内回来查看。
答案 0 :(得分:1)
你不能这样做!根据设计,允许从消息体中读取最多一个参数。因此,这不起作用。
此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。
您可以使用一些变通方法来完成这项工作: