模型未绑定到 JSON
Posted
技术标签:
【中文标题】模型未绑定到 JSON【英文标题】:Model not binding to JSON 【发布时间】:2021-07-21 07:12:33 【问题描述】:看起来我的模型没有正确绑定,并且字段都是空的。我在网上看过,似乎没有一个解决方案对我有用。我所有的属性都有 setter 和 getter,JSON 的属性名称与模型匹配,我正在对其进行字符串化。我正确设置了我的标题。也许我没有设置一些简单的东西。也许缺少一个包裹?调用不正确?
在前端这就是我发布 JSON 的方式
fetch("/Admin/SaveUser",
method: "Post",
headers:
"Content": "application/json",
'Accept': 'application/json;charset=utf-8'
,
body: JSON.stringify(userData)
).then(response =>
response.json().then(result =>
UpdateDisplay();
);
);
userData的内容
"UserId":"4dd9f40e-a9ad-418e-9954-e9459c5db1af","FirstName":"Jack","LastName":"","EmployeeCode":"",
"PhoneNumber":"","Email":"jthor@***.com"
我的控制器方法
[HttpPost]
public JsonResult SaveUser(UserModel user)
UserModel.UpdateUser(user);
return Json(false);
我的模特
public class UserModel
public Guid UserId get; set;
public string FirstName get; set;
public string LastName get; set;
public string Email get; set;
public string PhoneNumber get; set;
public string EmployeeCode get; set;
public List<string> UserRoleIds get; set;
public List<string> UserRoleNames get; set;
public List<SelectListItem> Roles get; set;
public UserModel()
UserRoleIds = new List<string>();
UserRoleNames = new List<string>();
Roles = new List<SelectListItem>();
【问题讨论】:
您的模型将 UserId 声明为 GUID,它是一种数字类型,但您的输入 JSON 包含该属性的字符串。模型活页夹不太可能让您逃脱惩罚。尝试将 UserId 属性的数据类型更改为字符串。 @DaveHolden 字段仍未绑定 @DaveHolden 这是.Net Guid。他提供的内容是正确的,如果他解决了他的绑定问题,将绑定到该属性。您来自哪个系统,Guid 是数字类型? @CallumMorrisson 来自 Microsoft 文档:“GUID 是一个 128 位整数(16 个字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符具有非常被复制的可能性很小。” docs.microsoft.com/en-us/dotnet/api/system.guid?view=net-5.0 @DaveHolden 不幸的是,找到一些几乎支持您的原始前提的文档并不会改变 在实践中 Guid 不是 .Net 中的数字类型的事实。所以我想我最初的问题仍然是,“你来自哪个系统,Guid 是数字类型?” 【参考方案1】:我之前遇到过这个问题,我可以通过添加[FromBody]
属性来解决它。
[HttpPost]
public JsonResult SaveUser([FromBody] UserModel user)
UserModel.UpdateUser(user);
return Json(false);
【讨论】:
这很有趣,我收到 415 错误UserEdit.js:31 POST https://localhost:44374/Admin/SaveUser 415
看来我需要使用[FromForm]
才不会出现415 错误但模型仍然没有绑定。【参考方案2】:
尝试将 Content 标头更改为“Content-Type”,它适用于我。
如下:
fetch("/Admin/SaveUser",
method: "Post",
headers:
"Content-Type": "application/json",
'Accept': 'application/json;charset=utf-8'
,
body: JSON.stringify(userData)
).then(response =>
response.json().then(result =>
UpdateDisplay();
);
);
【讨论】:
【参考方案3】:我想通了。我没有使用 html 手动创建表单,而是使用了 html 帮助器 html.beginform
并且有效。 IDK 为什么这有效,但确实有效。
【讨论】:
以上是关于模型未绑定到 JSON的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ASP.Net MVC 模型绑定器将空 JSON 数组绑定到 null?