ASP.NET Core MVC文件上传后AddUserId与TaskId存入数据库为0的问题
问题解决:ASP.NET Core MVC Ajax上传文件时AddUserId与TaskId无法正确绑定
核心问题出在前端FormData的键名与后端模型绑定不匹配,导致控制器无法正确接收AddUserId和TaskId的值,最终数据库存入默认值0。
解决方案步骤
1. 修正前端FormData的键名
前端代码中,你用了model.AddUserId和model.TaskId作为FormData的键名,但后端控制器的参数是直接的TaskListAttachment对象,而非名为model的参数。需要去掉model.前缀,直接使用实体的属性名:
var formData = new FormData(); // 去掉model.前缀,直接对应实体属性名 formData.append("AddUserId", addUserId); formData.append("TaskId", taskId); formData.append("file", $("#fileInput")[0].files[0]);
2. 明确后端模型绑定来源(可选但推荐)
在控制器的TaskListAttachment参数上添加[FromForm]特性,明确指定从表单数据中绑定,避免歧义:
[HttpPost] public IActionResult AddFile(IFormFile file, [FromForm] TaskListAttachment taskListAttachment) { // 调试时可先打印值,确认是否接收成功 // Console.WriteLine($"AddUserId: {taskListAttachment.AddUserId}, TaskId: {taskListAttachment.TaskId}"); if (file != null && file.Length > 0) { var fileName = Path.Combine("wwwroot/files", Path.GetFileName(file.FileName)); using (var stream = new FileStream(fileName, FileMode.Create)) { file.CopyTo(stream); } taskListAttachment.FileName = file.FileName; taskListAttachment.ContentType = file.ContentType; taskListAttachment.Data = new byte[file.Length]; taskListAttachment.AddDateTime = DateTime.Now; taskListAttachment.FilePath = fileName; taskListAttachmentManager.itemAdd(taskListAttachment); var addValue = JsonConvert.SerializeObject(taskListAttachment); return Json(addValue); } else { return Json(null); } }
原理说明
ASP.NET Core的模型绑定机制会根据参数名和FormData键名的匹配关系来赋值。原代码中model.AddUserId的键名,会让绑定器尝试寻找名为model的参数(而你的参数是taskListAttachment),因此无法正确赋值,最终使用属性的默认值0存入数据库。修正键名后,绑定器会直接将值映射到taskListAttachment的对应属性上。
内容的提问来源于stack exchange,提问作者Gökmen Ada
相关产品推荐
相关产品推荐

