【问题标题】:Passing multiple POST parameters in ASP.NET Core controller在 ASP.NET Core 控制器中传递多个 POST 参数
【发布时间】:2021-02-09 00:24:41
【问题描述】:

我有以下控制器方法:

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

【问题讨论】:

  • 您需要创建一个模型。将 FromBody 属性应用于参数以从 HTTP 请求的正文填充其属性。不要将 [FromBody] 应用于每个操作方法的多个参数。一旦请求流被输入格式化程序读取,它就不能再被读取以绑定其他 [FromBody] 参数。

标签: jquery ajax asp.net-core model-view-controller http-post


【解决方案1】:

由于传递的是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();
}

【讨论】:

  • 不幸的是,这样做让我收到了一个请求,其中参数 recipientUserIdmessage 为空。
  • 因为你的Ajax中的路由和你的Action不匹配,所以Ajax请求没有发送成功。你可以访问这个方法,可能是表单提交行为,所以请修改你的Ajax中的路由匹配Action匹配。
【解决方案2】:

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

【讨论】:

  • 我不知道我是否需要设置其他任何东西,但是使用此解决方案我无法使其工作,因为我根本没有收到对我的操作方法的请求。尽管如此,我还是设法通过创建一个与您展示的完全一样的模型来使其工作(尽管我不喜欢这个项目),并保留我原来的 javascript Ajax 调用,并对 stringifying 我的数据进行了小修改在发送它们之前。我不知道为什么会这样,但确实如此。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 2017-08-04
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多