模型未绑定到 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?

将 JSON 数组绑定到 ASP.NET MVC 3 中的列表的故障模型

来自 JQuery 填充字段的值未绑定到 MVC 模型

来自 JSON 的 WebAPI 模型绑定

MVC 5 多选列表值未绑定到发布时的模型

文档准备好后的数据源 ajax kendo 网格,因为模型未正确绑定在部分视图上