ASP.NET MVC5更新数据库图片路径时遇无参数构造函数报错
解决ASP.NET MVC5中更新图片路径时的"No parameterless constructor defined for this object"错误
我来帮你定位并解决这个问题!虽然你已经给控制器添加了无参构造函数,但这个错误的触发点往往不在控制器本身,咱们一步步梳理:
可能的错误原因及修复方案
1. 检查tbl_classWork实体类是否有无参构造函数
EF和MVC模型绑定在处理实体类时,要求类必须有无参构造。你只提到了控制器的无参构造,但如果tbl_classWork没有的话,就会触发这个错误。给实体类加上无参构造:
public class tbl_classWork { // 无参构造函数 public tbl_classWork() { } // 你的其他属性 public int Classwork_id { get; set; } public byte[] class_file { get; set; } // 建议改成byte[]类型存储二进制图片 // ...其他属性 }
2. 将HttpPostedFile替换为HttpPostedFileBase
MVC的模型绑定对抽象类HttpPostedFileBase支持更友好,使用具体类HttpPostedFile可能会导致绑定失败,进而触发构造函数相关错误。修改你的Action参数:
[HttpPost] public ActionResult Edit(tbl_classWork vehi, HttpPostedFileBase file) // 这里改成HttpPostedFileBase { // ...后续代码 }
3. 修正图片二进制数据的保存逻辑
你当前的代码里,class_file的赋值逻辑有问题:先赋值ContentType,然后又覆盖成byte[]的ToString(),这会导致你存储的是System.Byte[]字符串,而不是实际的图片二进制数据。如果class_file是用来存图片二进制的,改成byte[]类型后,修正这部分代码:
if (file != null && file.ContentLength > 0) // 先判断文件是否存在 { // imgToSave.class_file = file.ContentType; // 如果需要存ContentType,单独加一个字段比如FileContentType using (var binaryReader = new BinaryReader(file.InputStream)) { imgToSave.class_file = binaryReader.ReadBytes(file.ContentLength); } }
注:如果需要同时存储文件类型,可以给实体类新增一个string FileContentType字段,专门存file.ContentType
4. 优化模型更新逻辑,避免TryUpdateModel的潜在问题
TryUpdateModel可能会覆盖你手动赋值的内容,或者因为模型绑定的校验问题触发错误。你可以直接手动更新需要的字段,替代TryUpdateModel:
// 替换TryUpdateModel(imgToSave); imgToSave.其他属性 = vehi.其他属性; // 手动赋值你需要更新的其他字段 db.SaveChanges();
修改后的完整Edit方法示例
[HttpPost] public ActionResult Edit(tbl_classWork vehi, HttpPostedFileBase file) { SchoolERP db = new SchoolERP(); tbl_classWork imgToSave = db.tbl_classWork.FirstOrDefault(imga => imga.Classwork_id == vehi.Classwork_id); if (imgToSave == null) { return HttpNotFound("未找到对应的作业记录"); } if (ModelState.IsValid) { // 更新图片(如果有上传文件) if (file != null && file.ContentLength > 0) { using (var binaryReader = new BinaryReader(file.InputStream)) { imgToSave.class_file = binaryReader.ReadBytes(file.ContentLength); } // 如果有单独存ContentType的字段 // imgToSave.FileContentType = file.ContentType; } // 手动更新其他需要修改的属性 imgToSave.YourOtherProperty1 = vehi.YourOtherProperty1; imgToSave.YourOtherProperty2 = vehi.YourOtherProperty2; db.SaveChanges(); return RedirectToAction("Index"); } else { return View(vehi); } }
额外注意点
- 确保你的View里的表单使用了
enctype="multipart/form-data",否则文件无法正确上传:
@using (Html.BeginForm("Edit", "EditclassWork", FormMethod.Post, new { enctype = "multipart/form-data" })) { // 表单内容 }
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

