Jquery 在ASP.NET核心控制器中传递多个POST参数

Jquery 在ASP.NET核心控制器中传递多个POST参数,jquery,ajax,asp.net-core,model-view-controller,http-post,Jquery,Ajax,Asp.net Core,Model View Controller,Http Post,我有以下控制器方法: [HttpPost] public IActionResult AddNewMessage(string recipientUserId, string message) { var currentLoggedInUserId = this.User.FindFirstValue(ClaimTypes.NameIdentifier); _chatMessageRepository.AddNewMessage(currentLoggedInUserId, r

我有以下控制器方法:

[HttpPost]
public IActionResult AddNewMessage(string recipientUserId, string message)
{
    var currentLoggedInUserId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

    _chatMessageRepository.AddNewMessage(currentLoggedInUserId, recipientUserId, message);

    return Ok();
}
我正在尝试使用以下JQuery代码向其发送数据:

var data = {
    recipientUserId: selectedUser,
    message: message
};

$.ajax({
    url: '/api/chatmessages',
    type: 'POST',
    data: data,
    success: function (data) {
        alert(data.success);
    },
    error: function () {
        alert("error");
    }
});

这段代码的结果是,我在我的控制器上得到了请求,但是无论发生什么,参数总是
NULL
。此外,在发送数据之前,我尝试调用函数
JSON.Stringify()
,但没有任何区别。请记住,出于与项目相关的原因,我极力避免在此场景中使用模型类。

创建一个类,比如Message,它具有属性recepientUserId和UserId,然后用Message类替换控制器方法中的两个参数,并在其前面添加[FromBody]。有了这个u,asp.net应该尝试从请求主体映射数据

您的控制器方法现在接受url中的参数

正确的称呼方式是:

$.ajax({
url: '/api/chatmessages?recipientUserId=selectedUser&message=message',
type: 'POST',
success: function (data) {
    alert(data.success);
},
error: function () {
    alert("error");
}
});
post方法通常接受请求正文中的有效负载,您可以如下修改控制器方法:

[HttpPost]
public IActionResult AddNewMessage(YourCustomClass model)
{
    var currentLoggedInUserId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

    _chatMessageRepository.AddNewMessage(currentLoggedInUserId, model.recipientUserId, model.message);

    return Ok();
}
还有一个惯例是将此属性
[FromBody]
像这样放在控制器方法中:(没有它也可以工作)


由于传递的是Json类型的对象,因此只能在后台使用该对象类型来接受它

如果希望接收两个字符串类型参数,通常有两种方法

第一个是@davidedel所说的,您可以在querystring中传递值

在第二种方法中,您可以在Ajax中传递数据中的值,如下所示:

$.ajax({
url: '/api/AddNewMessage',
type: 'POST',
data: { recipientUserId: selectedUser, message: message },
success: function (data) {
    alert(data.success);
},
error: function () {
    alert("error");
}
你的行动:

[HttpPost]
public IActionResult AddNewMessage(string recipientUserId, string message)
{
//...
return Ok();
}

您需要创建一个模型。将属性应用于参数,以从HTTP请求主体填充其属性。对于每个操作方法,不要将[FromBody]应用于多个参数。一旦输入格式化程序读取了请求流,就无法再读取它以绑定其他[FromBody]参数。不幸的是,这样做会使我收到一个参数
recipientUserId
message
为空的请求。因为Ajax中的路由与您的操作不匹配,Ajax请求未成功发送。您可以访问此方法,这可能是表单提交行为,因此请修改Ajax中的路由以匹配操作匹配。我不知道是否需要设置其他内容,但使用此解决方案,我无法使其正常工作,因为我根本没有收到对我的操作方法的请求。尽管如此,我还是成功地创建了一个与您所展示的完全相同的模型(尽管这是我不喜欢的项目),并保留了我最初的javascript Ajax调用,只需在发送数据之前对我的数据进行少量的stringify修改。我不知道为什么会这样,但确实如此。
[HttpPost]
public IActionResult AddNewMessage(string recipientUserId, string message)
{
//...
return Ok();
}