我想Post
用一种形式Ajax/XMLHttpRequest
的ASP NET Core Controller
。
如果我只是简单Post
的表单,它会在其中获取数据,Controller
但是当使用XMLHttpRequest
我的model
默认字段时:
我在我的代码中包含了以下 2 种形式: - 一种形式仅Posts
用于属性中url
指定的形式,action
另一种形式调用 amethod
和Post
-s with XMLHttpRequest
。
HTML+JS
<!DOCTYPE html>
<html>
<head>
<script>
window.submit = function () {
var form = document.getElementById("delegate-form");
var data = new FormData(form);
var xhr = new XMLHttpRequest();
var content=form.getAttribute('Content-Type');
var method=form.getAttribute('method');
var action=form.getAttribute('action');
xhr.open(method,action);
xhr.setRequestHeader('Content-Type',content);
xhr.onload = function () {
if (xhr.status == 200) {
resolve(xhr.response);
}
else if (xhr.status != 200) {
reject("Failed to submit form with status" + xhr.status);
}
}
xhr.send(data);
};
</script>
</head>
<body>
<div id="Form-without-ajax">
<form method="POST" enctype="multipart/form-data" action="http://localhost:8300/api/bulk">
<input type="text" name="Name" value="aa" />
<input type="text" name="ID" value="13"/>
<input type="file">
<br>
<input style="align-content: flex-end" type="submit" />
</form>
</div>
<br>
<div id="Form-with-ajax">
<form method="POST" id="delegate-form" enctype="multipart/form-data" action="http://localhost:8300/api/bulk">
<input type="text" name="Name" value="ab" />
<input type="text" name="ID" value="33"/>
<input type="file">
<br>
</form>
<button onclick="submit()">Submit with delegate</button>
</div>
</body>
</html>
模型
[Serializable]
public class Data {
public string Name { get; set; }
public int ID { get; set; }
}
}
.NET 控制器
[HttpPost]
[Route("/api/bulk")]
public async Task TestBulkAsync(Data data) {
//data has Name=null and id=0 when using the XMLHttpRequest
}
PS我正在使用multipart/form-data
是因为除了该模型之外我还想附加一些文件。而且我需要一个像我这样的处理程序,submit
因为我需要在提交表单之前执行其他逻辑。
xhr.setRequestHeader('Content-Type',content);
通常,如果您将 FormData 对象传递给 XMLHttpRequest,它将从 FormData 对象生成 Content-Type 标头(这将是具有特定边界属性的多部分请求)。
在这里,您将使用手动确定的内容类型覆盖内容类型……并且省略了边界属性。然后服务器不知道边界在哪里,一切都中断了。
不要覆盖内容类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句