【问题标题】:IFormFile is always NULL in ASP.NET Core 3.0 MVCIFormFile 在 ASP.NET Core 3.0 MVC 中始终为 NULL
【发布时间】:2020-03-09 03:02:11
【问题描述】:

我已经在这个问题上敲了将近 2 天了。我将不胜感激任何帮助。无论我做什么,我的 IFormFile 始终为空。这是 MVC 设置:

剃刀视图:

<form method="post" enctype="multipart/form-data" asp-controller="Admin" asp-action="LoadProvidersBulk">
    <h6 class="text-muted">Upload Provider File</h6>
    <h6 class="text-muted small">Supported File Types: <b>.xlsx</b></h6>

    <div class="form-group-row d-inline-flex badge-dark" style="padding-top:10px; padding-bottom:10px;">
        <div class="col-sm-4" style="padding:2px">
            <input type="file" asp-for="FormFile" name="ProviderUpload" class="form-control-sm" />
        </div>
    </div>
    <div class="form-group row" style="padding-top:10px">
        <div class="col-sm-5 text-left">
            <button class="btn btn-sm btn-dark btn-primary" type="submit">Load Providers</button>
            <a asp-action="LoadProviders" class="btn btn-sm btn-dark btn-primary">Cancel</a>
        </div>
    </div>
</form>

型号:

using SampleProject.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace SampleProject.ViewModels
{
    public class LoadProvidersBulkViewModel
    {
        public IFormFile FormFile { get; set; }
    }
}

控制器:

        [HttpPost]
        public async Task<IActionResult> LoadProvidersBulk([FromForm(Name = "ProviderUpload")] LoadProvidersBulkViewModel loadProvidersBulkViewModel, CancellationToken cancellationToken)
        {
            var file = loadProvidersBulkViewModel.FormFile;            

            if (file == null || file.Length <= 0)
            {
                ModelState.AddModelError("BulkUploadError", "The file cannot be empty");
                return View("LoadProvidersBulk");
            }

            /* Removed all other code for brevity */

            return RedirectToAction("Users", _userManager.Users);
        }

【问题讨论】:

  • 能否补充一下HTTPGet的相关信息?前段时间我也遇到过类似的情况,问题是模型同名。

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc iformfile


【解决方案1】:

只需更改您的操作参数,如下所示:

  public async Task<IActionResult> LoadProvidersBulk([FromForm] LoadProvidersBulkViewModel loadProvidersBulkViewModel, CancellationToken cancellationToken)

而且你输入的名字必须改成FormFile

<input type="file" asp-for="FormFile" name="FormFile" class="form-control-sm" />

【讨论】:

    【解决方案2】:

    你混淆了asp-for 和名称属性name (asp-for="FormFile" name="ProviderUpload")。

    Input Tag Helper 将 HTML &lt;input&gt; 元素绑定到剃刀视图中的模型表达式是-

    &lt;input asp-for="&lt;Expression Name&gt;"&gt;

    为 asp-for 属性中指定的表达式名称生成 id 和 name HTML 属性。 asp-for="Property1.Property2" 等价于 m =&gt; m.Property1.Property2。表达式的名称用于asp-for 属性值。

    所以你的代码看起来像-

    查看:-

    @model SampleProject.ViewModels.LoadProvidersBulkViewModel
    
    
    <form method="post" enctype="multipart/form-data" asp-controller="Admin" asp-action="LoadProvidersBulk">
        <h6 class="text-muted">Upload Provider File</h6>
        <h6 class="text-muted small">Supported File Types: <b>.xlsx</b></h6>
    
        <div class="form-group-row d-inline-flex badge-dark" style="padding-top:10px; padding-bottom:10px;">
            <div class="col-sm-4" style="padding:2px">
                <input type="file" asp-for="FormFile" class="form-control-sm" />
            </div>
        </div>
        <div class="form-group row" style="padding-top:10px">
            <div class="col-sm-5 text-left">
                <button class="btn btn-sm btn-dark btn-primary" type="submit">Load Providers</button>
                <a asp-action="LoadProviders" class="btn btn-sm btn-dark btn-primary">Cancel</a>
            </div>
        </div>
    </form>
    

    控制器:-

        [HttpPost]
        public async Task<IActionResult> LoadProvidersBulk(LoadProvidersBulkViewModel model)
        {
            var file = model.FormFile;            
    
            if (file == null || file.Length <= 0)
            {
                ModelState.AddModelError("BulkUploadError", "The file cannot be empty");
                return View("LoadProvidersBulk");
            }
    
            /* Removed all other code for brevity */
    
            return RedirectToAction("Users", _userManager.Users);
        }
    

    【讨论】:

    • 感谢您的评论。我试过这个(以前也试过),我仍然得到一个空值文件。但是,我发现了问题,您的回答使我走上了正确的道路。我实现了自己的 IFormFile 接口,而不是使用 Microsoft.AspNetCore.Http using 指令。为什么...我还是新手,还在学习。
    【解决方案3】:

    我发现了问题。我为 IFormFile 实现了自己的接口类,而不是使用 Microsoft.AspNetCore.Http 指令。从模型中删除该引用后,它按预期工作。

    感谢那些花时间回复的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2019-04-15
      相关资源
      最近更新 更多