【问题标题】:.NET Core javascript to Controller POST.NET Core javascript 到控制器 POST
【发布时间】:2019-12-31 20:38:27
【问题描述】:

不知道哪里出错了,我有一个对象不会发布到我的控制器。

型号:

public class PostJsonModel
{
    public List<JsonModel> Things { get; set; }
}

public class JsonModel
{
    public int Id { get; set; }
    public string Tests { get; set; }
    public string MoreTests { get; set; }
}

控制器:

    [HttpPost]
    public async Task<IActionResult> DoSomething(PostJsonModel test)
    {
        //Save to the database

        return Json("Success");
    }

javascript:

    var test = {
        "Id": 5,
        "Tests": "Testing",
        "MoreTests": "More More More"
    };

    var more = [];

    more.push(test);
    more.push(test);
    more.push(test);

    var allSaveElements = {
        "Things": more
    };

    let xhr = new XMLHttpRequest();
    xhr.open('POST', '/Home/DoSomething', true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onload = function () {
        if (xhr.status === 200) {
           //Do something
        }
        else {
            alert('Request failed.  Returned status of ' + xhr.status);
        }
    };
    xhr.send(allSaveElements);

当我闯入控制器时,PostJsonModel 的“事物”计数为 0。 查看 chrome 中的网络输出,allSaveElements 正是我所期望的。

这在 .NET Framework (4.7) 应用程序中工作得非常好,但由于某种原因在 .NET Core (2.2) 中却没有

我显然遗漏了一些东西,有人可以指出吗?

【问题讨论】:

  • 你试过在action参数前使用[FromBody]属性吗?
  • 我认为您需要将 [FromBody] 放在参数public async Task&lt;IActionResult&gt; DoSomething([FromBody] PostJsonModel test) 之前
  • 您使用 XMLHttpRequest 是有原因的吗? JQuery Ajax 帖子可能是更好的选择。
  • @GaryStewart 我们没有在这个项目中使用 jQuery。过去我们遇到过一些问题,所以我们试图在没有它的情况下完成这个项目。

标签: javascript c# asp.net-core


【解决方案1】:

您正在绑定到一个复杂对象,并从主体传递数据,在这种情况下,您需要使用 FromBody。

这在 .NET Framework (4.7) 应用程序中运行良好,但是 由于某种原因不在 .NET Core (2.2) 中

您说得对,大约一年前我在过渡到 .NET Core 2.1 时就注意到了这一点。在 .NET Framework 中,如果您只为复杂对象发送一个参数,则不需要使用 FromBody,但在 .NET Core 中,您需要使用它

你可能想看看下面的微软链接:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.2

引用同一链接

如果默认行为没有给出正确的结果,您可以使用 以下属性之一指定要用于任何 给定目标。

[FromQuery] - 从查询字符串中获取值。

[FromRoute] - 从路由数据中获取值。

[FromForm] - 从发布的表单字段中获取值。

[FromBody] - 从请求正文中获取值。

[FromHeader] - 从 HTTP 标头中获取值。

【讨论】:

  • 感谢大纲和文档,它真的很有帮助。我不得不说,我对此感到很尴尬。
  • 你不用不好意思,我去过。很高兴知道它帮助了你:)
【解决方案2】:

我认为您需要将 [FromBody] 放在参数之前

[HttpPost] public async Task<IActionResult> DoSomething([FromBody] PostJsonModel test) { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2019-01-29
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多