在 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();
}
我有以下控制器方法:
[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();
}