如何在ASP.NET MVC控制器POST Index方法中获取GET Index的files对象数据
解决方案
HTTP协议本身是无状态的,GET请求和POST请求属于两次完全独立的请求,GET Index方法中的files对象会在GET请求结束后销毁,无法直接跨请求访问,可通过以下三种常用方案实现需求:
方案1:抽离公共逻辑生成files(最推荐)
把GET方法中生成files的逻辑单独抽成控制器私有方法,POST方法直接调用该方法即可拿到和GET方法完全一致的files数据,不会出现状态不一致问题,代码改动最小。
修改后的控制器代码示例:
public class UploadController:Controller { // 抽离公共的获取files逻辑 private List<string> GetFilesList() { // 此处填写你原来GET Index方法中生成files的业务代码 return files; } public IActionResult Index(){ var files = GetFilesList(); return View(files); } [HttpPost] public IActionResult Index(IFormFile importFile){ // 直接调用公共方法获取和GET方法中一致的files对象 var originalFiles = GetFilesList(); // 此处可直接使用originalFiles处理业务逻辑,比如合并新上传的文件得到newFiles // ...你的业务代码 return View("Index", newFiles); } }
方案2:通过表单隐藏域传递现有文件列表
如果你的files对象就是文件名列表,可直接在视图的表单块内添加隐藏域,把现有文件名列表随上传请求一起提交到POST方法。
修改你的视图代码,在Html.BeginForm块内新增隐藏域部分:
@using (Html.BeginForm("Index", "Upload", FormMethod.Post, new { @id = "upldFrm", @enctype = "multipart/form-data" })) { <!-- 新增隐藏域提交现有文件名列表 --> @foreach (var file in Model.FileName) { <input type="hidden" name="existingFiles" value="@file" /> } <div class="row"> <div class="form-group col-md-6"> <input type="file" class=" form-control" name="importFile" /> </div> <div class="form-group col-md-6"> <input type="submit" name="filesubmit" value="Upload" /> </div> </div> }
随后在POST方法中添加参数接收即可:
[HttpPost] public IActionResult Index(IFormFile importFile, List<string> existingFiles) { // existingFiles就是GET方法传递给视图的files列表 // 你的业务代码 return View("Index", newFiles); }
方案3:用TempData/Session缓存文件列表(适合小数据量场景)
如果files数据量不大,也可以在GET方法中将files存入TempData缓存,POST方法直接读取使用:
public IActionResult Index(){ // 你的业务代码生成files TempData["OriginalFiles"] = files; // 如果需要读取TempData后仍保留数据,添加这句:TempData.Keep("OriginalFiles"); return View(files); } [HttpPost] public IActionResult Index(IFormFile importFile){ // 转换为你实际的files类型即可 var originalFiles = TempData["OriginalFiles"] as List<string>; // 你的业务代码 return View("Index", newFiles); }
注意TempData默认只能读取一次,读取后会自动销毁,需要长期保留可调用TempData.Keep方法;如果使用Session存储,需要提前在Program.cs中开启Session服务。
内容的提问来源于stack exchange,提问作者Christian01
相关产品推荐
相关产品推荐

