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



我有以下控制器方法:

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

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

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

第一个是,正如@David Edel所说,您可以在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();
}

您的控制器方法现在接受来自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 )

创建一个类,比如Message,它具有属性recepientUserId和UserId,然后用Message类替换控制器方法中的两个参数,并在它之前添加[FromBody]

最新更新