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

Passing multiple POST parameters in ASP.NET Core controller

我有以下控制器方法:

[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(),但没有任何区别。请记住,出于与项目相关的原因,我极力避免在这种情况下使用模型 class。

制作一个class,比如说Message,它具有属性recepientUserId 和UserId,然后用Message class 替换控制器方法中的两个参数并在它之前添加[FromBody]。有了这个你指出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] 放入您的控制器方法中,如下所示:(没有它也可以工作)

[HttpPost]
public IActionResult AddNewMessage([FromBody]YourCustomClass model )

由于传递的是Json类型的对象,只能在后台使用对象类型接受。

如果要接收两个字符串类型的参数,一般有两种方法。

首先正如@David Edel所说,你可以在查询字符串中传递值。

在第二种方法中,你可以在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();
}