IFormFile 在 ASP.NET Core 3.0 MVC 中始终为 NULL
IFormFile is always NULL in ASP.NET Core 3.0 MVC
我已经为这个问题苦苦思索了将近 2 天。我将不胜感激任何帮助。无论我做什么,我的 IFormFile 始终为空。这是 MVC 设置:
Razor 视图:
<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);
}
您混淆了 asp-for
和名称属性 name
(asp-for="FormFile" name="ProviderUpload"
)。
Input Tag Helper 将 HTML <input>
元素绑定到 razor 视图中的模型表达式是-
<input asp-for="<Expression Name>">
为 asp-for 属性中指定的表达式名称生成 id 和 name HTML 属性。 asp-for="Property1.Property2"
等同于 m => 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);
}
只需像下面这样更改您的操作参数:
public async Task<IActionResult> LoadProvidersBulk([FromForm] LoadProvidersBulkViewModel loadProvidersBulkViewModel, CancellationToken cancellationToken)
并且您的输入名称必须更改为 FormFile:
<input type="file" asp-for="FormFile" name="FormFile" class="form-control-sm" />
我发现了问题。我为 IFormFile 实现了自己的接口 class 而不是使用 Microsoft.AspNetCore.Http 指令。一旦从模型中删除该引用,它就会按预期工作。
感谢那些花时间回复的人。
2 年零 2 个月后,我遇到了完全相同的问题。
我花了一个多小时才弄清楚我忘记了 Multipart/form-data
<form asp-action="Create" method="post" enctype="multipart/form-data">
如果有人 运行 再次遇到此问题,请发布此信息
我已经为这个问题苦苦思索了将近 2 天。我将不胜感激任何帮助。无论我做什么,我的 IFormFile 始终为空。这是 MVC 设置:
Razor 视图:
<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);
}
您混淆了 asp-for
和名称属性 name
(asp-for="FormFile" name="ProviderUpload"
)。
Input Tag Helper 将 HTML <input>
元素绑定到 razor 视图中的模型表达式是-
<input asp-for="<Expression Name>">
为 asp-for 属性中指定的表达式名称生成 id 和 name HTML 属性。 asp-for="Property1.Property2"
等同于 m => 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);
}
只需像下面这样更改您的操作参数:
public async Task<IActionResult> LoadProvidersBulk([FromForm] LoadProvidersBulkViewModel loadProvidersBulkViewModel, CancellationToken cancellationToken)
并且您的输入名称必须更改为 FormFile:
<input type="file" asp-for="FormFile" name="FormFile" class="form-control-sm" />
我发现了问题。我为 IFormFile 实现了自己的接口 class 而不是使用 Microsoft.AspNetCore.Http 指令。一旦从模型中删除该引用,它就会按预期工作。
感谢那些花时间回复的人。
2 年零 2 个月后,我遇到了完全相同的问题。
我花了一个多小时才弄清楚我忘记了 Multipart/form-data
<form asp-action="Create" method="post" enctype="multipart/form-data">
如果有人 运行 再次遇到此问题,请发布此信息