ASP.NET Core 3.1文件上传下载报错:NullReferenceException求助
解决ASP.NET Core 3.1文件上传下载的NullReferenceException及功能异常
问题分析
- 空引用异常根源:上传完成后,POST请求的
Index方法直接返回View(),未传递文件列表模型,导致视图中Model为null,执行@foreach (var item in Model)时抛出空引用异常。 - 下载功能失效原因:视图中下载链接传递的路由参数是
filename,但控制器的DownloadImage方法接收的是int id,参数不匹配无法定位目标文件。
修复步骤
1. 修正控制器POST方法
修改DemoController的POST版Index方法,上传完成后重定向到GET版Index(避免重复提交问题),确保视图能获取到最新的文件列表模型:
[HttpPost] public IActionResult Index(IFormFile files) { if (files != null && files.Length > 0) { var fileName = Path.GetFileName(files.FileName); var fileExtension = Path.GetExtension(fileName); var newFileName = $"{Guid.NewGuid()}{fileExtension}"; var objfiles = new Files() { Name = newFileName, FileType = fileExtension, }; using (var target = new MemoryStream()) { files.CopyTo(target); objfiles.DataFiles = target.ToArray(); } _context.Files.Add(objfiles); _context.SaveChanges(); } // 重定向到GET请求的Index,确保模型被正确传递 return RedirectToAction(nameof(Index)); }
2. 修正视图下载链接
修改视图中的下载链接,传递正确的DocumentId参数:
<ul> @foreach (var item in Model ?? new List<Info.Models.Files>()) { <li> <a asp-action="DownloadImage" asp-route-id="@item.DocumentId"> @item.Name </a> </li> } </ul>
额外优化:添加Model ?? new List<Info.Models.Files>(),即使模型为null也不会抛出异常,提升页面健壮性
3. 可选优化:修正ContentType获取
当前代码中FileType存储的是文件扩展名(如.pdf),但File方法需要标准MIME类型(如application/pdf),可添加MIME类型映射逻辑:
// 在DownloadImage方法中替换ContentType的赋值逻辑 var contentType = GetContentType(item.FileType); // 新增辅助方法 private string GetContentType(string fileExtension) { var provider = new FileExtensionContentTypeProvider(); if (!provider.TryGetContentType(fileExtension, out var contentType)) { contentType = "application/octet-stream"; } return contentType; }
修复后验证
- 上传文件后,页面自动重定向到GET版
Index,加载最新文件列表,不会再抛出空引用异常。 - 点击下载链接时,会正确传递文档ID到
DownloadImage方法,实现正常下载。
内容的提问来源于stack exchange,提问作者hhaannyy
相关产品推荐
相关产品推荐

