ASP.NET Core 6 MVC中Ajax Form Post无法绑定到对象问题求助
项目中其他区域的类似代码运行正常,但当前接口的studentDTO对象始终为null。请求能到达控制器方法,但无法获取表单数据;移除[FromForm]会收到“415 Unsupported Media Type”响应。
控制器方法
[HttpPost("SaveStudent")] public async Task<IActionResult> SaveStudent( [Bind(Prefix = "Student")][FromForm] StudentDTO studentDTO ) { // 业务逻辑 }
实体类
public class StudentDTO { public Guid StudentID { get; set; } public Guid AccountID { get; set; } public int TuitionID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public decimal AnnualTuitionCost { get; set; } public int TuitionMonths { get; set; } public string StartDate { get; set; } public string EndDate { get; set; } }
Ajax请求代码
var formData = $("#addEditStudentFrm").serialize(); console.log(formData); $.ajax({ url : '/api/blah/SaveStudent/', dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8', data: formData, type: 'POST', success: function (result) { // 成功逻辑 }, error: function (result) { // 错误逻辑 } });
请求详情

排查与解决建议
修正绑定前缀不匹配问题
控制器中使用了[Bind(Prefix = "Student")],但从请求截图可见,所有表单字段都没有Student.前缀(比如直接是FirstName而非Student.FirstName)。两种解决方式:- 移除控制器参数上的
[Bind(Prefix = "Student")]属性; - 修改HTML表单中所有input的
name属性,添加Student.前缀,例如name="Student.FirstName"、name="Student.LastName"。
- 移除控制器参数上的
校验表单字段与DTO属性的匹配性
确保HTML表单中每个input的name属性与StudentDTO的属性名完全一致(大小写不敏感,但拼写必须正确),没有遗漏或错误。比如StudentID对应name="StudentID",AnnualTuitionCost对应name="AnnualTuitionCost"。确认表单序列化的完整性
检查表单中的所有需要传递的字段是否都设置了name属性——serialize()只会序列化带有name属性的元素,没有name的字段不会被提交。验证DTO的构造函数与访问性
确保StudentDTO是public访问级别,且存在默认无参构造函数(如果手动定义了带参构造函数,需要显式添加无参构造函数,否则模型绑定无法实例化对象)。保留
[FromForm]属性
移除[FromForm]出现415错误是因为请求是application/x-www-form-urlencoded格式,而默认模型绑定会尝试解析JSON格式的请求体,因此必须保留[FromForm]来指定从表单数据绑定。
内容的提问来源于stack exchange,提问作者flashsplat

