我正在尝试使用 jQuery.ajax 和
contentType: 'application/json; charset=utf-8'
进行 ajax 调用。
我使用 .NET 8 为 ASP.NET Core MVC 创建了一个新项目。
这是Javascript代码:
$('#addPerson').click(function () {
var person = {
Name: 'Test1',
Email: 'Test2'
};
$.ajax({
url: '@Url.Action("AddPerson")',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ person: person }),
// data: { person: person },
type: 'Post',
success: function (data) {
}
});
});
这是控制器方法和模型:
[HttpPost]
public IActionResult AddPerson(Person person)
{
return Ok();
}
public class Person
{
public string Name { get; set; }
public string Email { get; set; }
}
由于某种原因,此人的属性始终为空。
如果我在 ajax 调用中评论下面显示的行
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ person: person }),
并取消注释下面显示的行,然后我可以看到控制器中正确填充的属性。
// data: { person: person },
此外,如果我在控制器参数中添加
[FromBody]
并将数据更改为 JSON.stringify(person)
,它仍然有效,但我不希望这样,因为在很多情况下我可能需要向控制器发送整个人对象,然后发送附加参数.
在 ASP.NET MVC 的早期版本中,我相信这是有效的。我的猜测是我必须在
program.cs
中指定一个序列化器才能使其工作。但我尝试了不同的变体但没有成功。
您可以使用 NuGetpackage 中的 JObject 并使用命名空间“Newtonsoft.Json.Linq”,但您仍然可能想使用 [FromBody] 属性:
public IActionResult AddPerson([FromBody] JObject objRequest)
{
Person person = JsonConvert.DeserializeObject<Person>(objRequest.ToString());
string phone = objRequest.Value<string>("phone"); // additional field extraction
// you can add any other fields to objRequest (Request Body) and only those matching fields will be automatically bind to Person object
return Ok();
}