使用 XmlHttpRequest 中的 FormData 将数据发布到 asp.net 核心网站 api 时出现“400 错误请求”
"400 bad request" when posting data to asp.net core web api with FormData in XmlHttpRequest
我有一个 ASP.Net 核心网站 API 执行此操作 :
// POST api/TodoList
[HttpPost]
public void Post([FromBody] Tache tache)
{
TodoListContext.AjouterTache(tache);
}
这是 Tache 实体的代码:
public class Tache
{
public int Id { get; set; }
[DataType(DataType.MultilineText)]
[Required, MaxLength(250)]
public string Description { get; set; }
[DataType(DataType.Date)]
public DateTime DateCreation { get; set; }
[DataType(DataType.Date)]
public DateTime DateEcheance { get; set; }
public int Priorite { get; set; }
public bool Terminee { get; set; }
}
我从 javascript SPA 调用操作,XHR 如下:
function ajouterTache() {
// Construit un objet Tâche à partir des valeurs saisies
let tache = {};
tache.id = document.getElementById("idTache").value;
tache.dateCreation = document.getElementById("dateCreation").value;
tache.dateEcheance = document.getElementById("dateEcheance").value;
tache.priorite = document.getElementById("priorite").value;
tache.terminee = document.getElementById("terminee").checked;
tache.description = document.getElementById("description").value;
console.log(tache);
// Envoie la tâche à l'API
const req = new XMLHttpRequest();
req.onload = function () {
...
};
req.open('POST', uri, true);
req.setRequestHeader("Content-Type", "application/json");
req.send(JSON.stringify(tache));
}
上面的代码工作正常,但这个不行:
function ajouterTache() {
data = new FormData(document.getElementById("formEdit"));
// Envoie la tâche à l'API
const req = new XMLHttpRequest();
req.onload = function () {
...
};
req.open('POST', uri, true);
req.setRequestHeader("Content-Type", "application/json");
req.send(data);
}
表单的每个字段都有正确的名称,已启用并包含有效输入。
但我总是收到“400:错误请求”响应。
Firefox 的调试工具在 XHR 结果中显示以下错误:
Input string '-----------------------------18691991225667' is not a valid number. Path '', line 1, position 43.
title : One or more validation errors occurred
我在发送 xhr 之前添加了这段代码以查看数据对象的内容:
let formData = new FormData(document.getElementById("formEdit"));
for (let pair of formData.entries()) {
console.log(pair[0] + ': ' + pair[1] + ", " + typeof pair[1]);
}
这是结果:
idTache: 11
dateCreation: 2019-10-08
dateEcheance: 2019-10-22
priorite: 1
terminee: on
description: essai
看来是对的。那么我使用 FormData 有什么问题?
如果你想post数据与FormData
,那么你不应该将Content-Type
设置为application/json
。此外,使用[FromForm]
代替[FromBody]
在您的操作参数上。
1.Remove js 代码中的行下方
req.setRequestHeader("Content-Type", "application/json");
2.Use [FromForm]
[HttpPost]
public void Post([FromForm] Tache tache)
Here is the result :
idTache: 11
dateCreation: 2019-10-08
dateEcheance: 2019-10-22
priorite: 1
terminee: on
description: essai
由于您收到的数据是模型类型 Tache
,因此您需要传递名为 id
的 属性,而不是日志结果中显示的 idTache
。
您没有显示您的视图代码,我建议您使用 name="id"
作为该输入文本框。
在我的例子中,正确的日志结果有一个 __RequestVerificationToken:
,如果你使用 <form id="formEdit">
:
,它也会被加速
id: 11
dateCreation: 2019-10-08
dateEcheance: 2019-10-22
priorite: 1
terminee: on
description: essai
__RequestVerificationToken:xxxxxxxx
我有一个 ASP.Net 核心网站 API 执行此操作 :
// POST api/TodoList
[HttpPost]
public void Post([FromBody] Tache tache)
{
TodoListContext.AjouterTache(tache);
}
这是 Tache 实体的代码:
public class Tache
{
public int Id { get; set; }
[DataType(DataType.MultilineText)]
[Required, MaxLength(250)]
public string Description { get; set; }
[DataType(DataType.Date)]
public DateTime DateCreation { get; set; }
[DataType(DataType.Date)]
public DateTime DateEcheance { get; set; }
public int Priorite { get; set; }
public bool Terminee { get; set; }
}
我从 javascript SPA 调用操作,XHR 如下:
function ajouterTache() {
// Construit un objet Tâche à partir des valeurs saisies
let tache = {};
tache.id = document.getElementById("idTache").value;
tache.dateCreation = document.getElementById("dateCreation").value;
tache.dateEcheance = document.getElementById("dateEcheance").value;
tache.priorite = document.getElementById("priorite").value;
tache.terminee = document.getElementById("terminee").checked;
tache.description = document.getElementById("description").value;
console.log(tache);
// Envoie la tâche à l'API
const req = new XMLHttpRequest();
req.onload = function () {
...
};
req.open('POST', uri, true);
req.setRequestHeader("Content-Type", "application/json");
req.send(JSON.stringify(tache));
}
上面的代码工作正常,但这个不行:
function ajouterTache() {
data = new FormData(document.getElementById("formEdit"));
// Envoie la tâche à l'API
const req = new XMLHttpRequest();
req.onload = function () {
...
};
req.open('POST', uri, true);
req.setRequestHeader("Content-Type", "application/json");
req.send(data);
}
表单的每个字段都有正确的名称,已启用并包含有效输入。
但我总是收到“400:错误请求”响应。
Firefox 的调试工具在 XHR 结果中显示以下错误:
Input string '-----------------------------18691991225667' is not a valid number. Path '', line 1, position 43.
title : One or more validation errors occurred
我在发送 xhr 之前添加了这段代码以查看数据对象的内容:
let formData = new FormData(document.getElementById("formEdit"));
for (let pair of formData.entries()) {
console.log(pair[0] + ': ' + pair[1] + ", " + typeof pair[1]);
}
这是结果:
idTache: 11
dateCreation: 2019-10-08
dateEcheance: 2019-10-22
priorite: 1
terminee: on
description: essai
看来是对的。那么我使用 FormData 有什么问题?
如果你想post数据与FormData
,那么你不应该将Content-Type
设置为application/json
。此外,使用[FromForm]
代替[FromBody]
在您的操作参数上。
1.Remove js 代码中的行下方
req.setRequestHeader("Content-Type", "application/json");
2.Use [FromForm]
[HttpPost]
public void Post([FromForm] Tache tache)
Here is the result :
idTache: 11 dateCreation: 2019-10-08 dateEcheance: 2019-10-22 priorite: 1 terminee: on description: essai
由于您收到的数据是模型类型 Tache
,因此您需要传递名为 id
的 属性,而不是日志结果中显示的 idTache
。
您没有显示您的视图代码,我建议您使用 name="id"
作为该输入文本框。
在我的例子中,正确的日志结果有一个 __RequestVerificationToken:
,如果你使用 <form id="formEdit">
:
id: 11
dateCreation: 2019-10-08
dateEcheance: 2019-10-22
priorite: 1
terminee: on
description: essai
__RequestVerificationToken:xxxxxxxx