.NET Core MVC POST控制器方法中Model无法绑定问题求助
问题根源
- 最初的写法错误:你通过axios提交的JSON数据多了一层
model外层包裹,实际请求体结构为{"model": {"CompanyId":"xxx", "FooterHtml":"xxx"}},和控制器要绑定的CompanyFooterUpdateModel结构不匹配,模型绑定系统找不到对应字段,自然无法完成赋值。 - 第一次更新后的写法错误:ASP.NET Core 中
[FromBody]特性只能将整个JSON请求体绑定到一个参数上,不支持同时绑定多个基本类型参数,所以哪怕你传的字段正确,也无法分别映射到CompanyId和FooterHtml两个独立参数上。
解决方案
方案1:保留原模型绑定(推荐)
不用改控制器代码,只需要调整前端axios提交逻辑,去掉外层的model嵌套,直接传递和模型结构匹配的字段即可:
function SaveCompanyFooter() { axios.post('@Url.Action("SaveFooter", "Company")', { FooterHtml: window.HtmlEditor.getData(), CompanyId: "@Model.CompanyId" } ).then(response => { // 原有逻辑不变 }); }
控制器保持你最开始的写法即可:
public async Task<IActionResult> SaveFooter([FromBody] CompanyFooterUpdateModel model) { // 业务逻辑不变 }
方案2:直接接收独立参数
如果你不想用模型绑定,要直接接两个参数,就需要改为Form表单格式提交,控制器参数添加[FromForm]特性:
前端代码调整为:
function SaveCompanyFooter() { const formData = new FormData(); formData.append("CompanyId", "@Model.CompanyId"); formData.append("FooterHtml", window.HtmlEditor.getData()); axios.post('@Url.Action("SaveFooter", "Company")', formData) .then(response => { // 原有逻辑不变 }); }
控制器代码调整为:
public async Task<IActionResult> SaveFooter([FromForm] Guid CompanyId, [FromForm] string FooterHtml) { // 业务逻辑不变 }
排查技巧
后续遇到类似绑定问题,可以先打开浏览器F12开发者工具的「网络」标签,查看请求的载荷(Payload)结构,确认和你要绑定的模型/参数结构完全匹配,再检查控制器参数的特性标签是否和请求的Content-Type对应。
内容的提问来源于stack exchange,提问作者Nikita Kutumov
相关产品推荐
相关产品推荐

