C# 从Ajax调用在Asp.NETCore中进行模型绑定
我有一个Javascript函数,可以调用Asp.Net核心控制器:C# 从Ajax调用在Asp.NETCore中进行模型绑定,c#,ajax,asp.net-core,model-binding,C#,Ajax,Asp.net Core,Model Binding,我有一个Javascript函数,可以调用Asp.Net核心控制器: const details = { thisModel: { Id: '@Model.OrderId', Name: '@Model.Name', Data: data, StringData: '' } }; const data = JSON.stringify(
const details =
{
thisModel: {
Id: '@Model.OrderId',
Name: '@Model.Name',
Data: data,
StringData: ''
}
};
const data = JSON.stringify(details);
$.ajax({
type: "POST",
url: "/Orders/CreateOrder",
data: data,
datatype: "json",
contentType: 'application/json; charset=utf-8',
success: function (data) {
// Success!
}
});
我正在尝试调用Asp.Net核心控制器方法:
[HttpPost]
public async Task<IActionResult> CreateOrder([FromBody]OrderDetails orderDetails)
{
我遇到的问题是,虽然确实调用了控制器方法,但orderDetails中的每个值都是null。我已经看过了,据我所知,我遵守了所有的规则,所以我有点不确定为什么数据没有被传递。有人能帮忙吗?因为您的模型中有一个
ifformfile
属性,我知道您想将文件上载到API
这里的问题是,您不能在JSON中上载文件。这是HTTP协议的一个“限制”。要上载文件,您应该使用
假设您已经有了这样的html表单:
public class OrderDetails
{
public string Id { get; set; }
public string Name { get; set; }
public IFormFile Data { get; set; }
public string StringData { get; set; }
}
您的文件:
然后,您应该添加新的隐藏字段来存储@Model.OrderId
和@Model.Name
:
您的文件:
现在,在javascript代码中,您需要将表单输入转换为新的FormData
变量,然后将其提交给api。最简单的方法是:
var form = $('#fileUploadForm')[0];
var data = new FormData(form);
$.ajax({
type: "POST",
url: "/Orders/CreateOrder",
data: data,
enctype: 'multipart/form-data', // Important!!!!
processData: false, //prevent jQuery transforming the data into a query string
contentType: false,
cache: false,
success: function (data) {
// Success!
}
});
这确实解决了我的问题,所以谢谢你。但是,即使文件为空,我也会得到相同的行为。我将进行一些测试,以了解为什么即使文件为空,也会出现相同的行为。我不知道为什么会发生这种情况,但我相信这是因为您的模型中有一个文件,Asp.net模型绑定可能会首先验证它,而不绑定任何内容。或者因为我在删除的答案中说的话。无论如何,我很乐意提供帮助,并将深入了解Asp.Net模型绑定以了解这一点。