为啥 IFormFile 显示为空,我该如何解决?

Posted

技术标签:

【中文标题】为啥 IFormFile 显示为空,我该如何解决?【英文标题】:Why is IFormFile showing null, and how do I fix it?为什么 IFormFile 显示为空,我该如何解决? 【发布时间】:2016-02-10 21:03:46 【问题描述】:

我在 VS 2015 中使用 ASP.NET 5、MVC 6。我正在制作一个 Web 应用程序。在我的表格上,我有:

    <form method="post" enctype="multipart/form-data">
    <div id="uploadSection" >
        <label >Select files for upload</label>
        <input type="file" id="fileSelect" name="fileSelect" multiple />
    </div>

    <div>
        <input type="submit" id="thisbutton" value="button"  />
    </div>
    </form>

在我的控制器中:

        [HttpPost]
    public async Task<IActionResult> FileForm(FileViewModel vm, IFormFile file)
    
        if (ModelState.IsValid)
        
            //IFormFileCollection files = Request.Form.Files;
            string filePath = Path.Combine("C:", "transfers");
            //foreach (var file in files)
            //
                if (file != null && file.Length > 0)
                
                    var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                    await file.SaveAsAsync(Path.Combine(filePath, fileName));
                
            //
            ModelState.Clear();
        
        return View();
    

我有一个更大的表单,其中包含要进入我的 FormViewModel 的母表单字段(所有字段都按应有的方式填充),我实际上尝试将 IFormFileCollection、ICollection、IList、List 作为方法中的参数上面,而是直接将它放在我的视图模型中。无论我是作为单个文件还是多个文件,在模型或控制器中,我总是得到空值。 'IFormFileCollecion files = Request.Form.Files' 确实有效,但我不想那样做,因为它应该按照我拥有或拥有的方式工作。 当我将文件的属性放在我的模型中时,我将“[Required]”放在它上面并且它不会触发。

而且,更好的是,我用 fiddler 运行了多次,它实际上是在 POST 文件——那么为什么不将它们投射到模型中呢?

我的依赖项有错吗?谁能想到可能导致这种情况的原因?

  "dependencies": 
    "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.AspNet.Http":  "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
  ,

【问题讨论】:

【参考方案1】:

您的文件输入具有“fileSelect”的名称属性。您的操作参数的名称是“文件”。让它们匹配,它应该可以工作。

【讨论】:

做到了。我什至没有意识到我没有在所有其他表单字段上使用 ID,我使用的是 asp-for。我有名称/ID,因为我有一个正在测试的 jQuery 函数。谢谢。 通过 ajax 提交文件时也是如此:formData.append("file", file); 我花了好几个小时才解决这个问题。动作中的参数名称必须与提交的名称匹配。否则,控制器将处理请求,但参数将为空【参考方案2】:

可能听起来很简单!但除了相同的//name// @model-view-controller,检查form.serialize(); 导致我24 小时找到这个!

【讨论】:

以上是关于为啥 IFormFile 显示为空,我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

为啥颤振向我显示此错误,我该如何解决?

列在书面“选择 *”查询中显示为空,但在“选择前 1000 个”中填充。我该如何解决这个问题?

在 POST 方法中,IFormFile 参数为空

当我说可以为空或为空时,我不断收到“db context null”,我该如何解决?

为啥我的财产可能会泄漏,我该如何解决?

为啥此 C++ 代码中的构造函数不明确,我该如何解决?