带下拉选择的表单上传文件,文件出现在Request.Form.Keys而非Files
带下拉框的文件上传表单异常修复方案
问题根源
- 表单编码类型格式错误:视图里的
enctype写成了"multipart / form - data",多余的空格导致浏览器无法识别正确的多部分表单编码,文件被当作普通文本字段提交,所以出现在Request.Form.Keys里,而非Files集合。 - 名称不匹配:视图中文件输入框的
name是LoadedFile,但Controller里获取时用的是LoadFile,少了一个字母d,自然找不到对应的文件。
修复步骤
1. 修正表单enctype属性
把视图里的enctype改成标准无空格的格式:
@using (Html.BeginForm("UploadForm", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
2. 统一文件名称匹配
Controller里把获取文件的名称改成和视图一致的LoadedFile:
var file = Request.Form.Files["LoadedFile"];
3. 更简洁的参数绑定(可选)
不用手动从Request里取,直接通过Controller参数接收文件,符合ASP.NET Core的最佳实践:
public IActionResult UploadForm(ViewModel model, IFormFile LoadedFile) { uView = model; try { Stream? data = null; if (LoadedFile != null && LoadedFile.Length > 0) { uView.Filename = LoadedFile.FileName; data = LoadedFile.OpenReadStream(); } uView.Workbook = new XLWorkbook(data); } catch (Exception ex) { // 捕获并记录错误信息 } return View(uView); // 记得返回视图或对应结果 }
4. 绑定到ViewModel(可选)
如果想让文件直接绑定到ViewModel,给ViewModel加个IFormFile属性:
public class ViewModel { public string Selection { get; set; } public string Filename { get; set; } public XLWorkbook? Workbook { get; set; } public IFormFile? LoadedFile { get; set; } // 添加这个属性 }
然后Controller直接用ViewModel接收,代码更简洁:
public IActionResult UploadForm(ViewModel model) { uView = model; try { Stream? data = null; if (model.LoadedFile != null && model.LoadedFile.Length > 0) { uView.Filename = model.LoadedFile.FileName; data = model.LoadedFile.OpenReadStream(); } uView.Workbook = new XLWorkbook(data); } catch (Exception ex) { // 捕获并记录错误信息 } return View(uView); }
内容的提问来源于stack exchange,提问作者Micah Stovall
相关产品推荐
相关产品推荐

