[英]ASP.NET Core file upload form binding problems
我尝试使用大量教程将视图的表单绑定到控制器的上传方法,例如:
https://docs.microsoft.com/ru-ru/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.2
因此,据我了解,如果我创建一个控制器并进行查看,那么所有这些都应该工作。 控制器:
(此处禁用了异步功能,但在两种情况下结果都是相同的)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace ExcelParser.Controllers
{
public class HomeController : Controller
{
static HttpClient httpClient = new HttpClient();
// GET: /<controller>/
public IActionResult Index()
{
if (httpClient.BaseAddress == null)
{
httpClient.BaseAddress = new Uri("http://localhost:51313");
}
var response = httpClient.GetAsync("api/file").Result;
ViewBag.Templates = response.Content.ReadAsAsync<IEnumerable<string>>().Result;
return View();
}
public IActionResult AddFile()
{
return View();
}
/*[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
Console.WriteLine("======UPLOAD======");
Console.WriteLine(file.FileName);
string msg = "i go there";
return RedirectToAction("Index");
}*/
[HttpPost]
public IActionResult UploadFile(IFormFile file)
{
Console.WriteLine("======UPLOAD======");
Console.WriteLine(file.FileName);
string msg = "i go there";
return RedirectToAction("Index");
}
}
}
视图AddFile.cshtml:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>AddFile</title>
</head>
<body>
<form asp-controller="Home" asp-action="UploadFile" method="post"
enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload File</button>
</form>
</body>
</html>
因此,我在控制器的string msg = "i go there";
放置了断点string msg = "i go there";
并转到http:// myhost:port / addfile网页 。 因此,呈现了视图AddFile,但是当我选择一个文件并按下Submit按钮时,什么也没发生。 因此,我的控制器未收到对UploadFile操作的调用的问题。 我尝试了许多示例和教程,结果却是相同的-绑定不起作用。 我使用ASP.NET Core 2.2
在浏览器中检查了html代码(适用于Win的Chrome 72)。 我预计元素属性将被Razor转换。 来自浏览器的代码:
<html><head>
<meta name="viewport" content="width=device-width">
<title>AddFile</title>
</head>
<body>
<form asp-controller="Home" asp-action="UploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload File</button>
</form>
</body></html>
因此,似乎Razor无法正常工作,并且未触发异步方法UploadFile。
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
Console.WriteLine("======UPLOAD======");
Console.WriteLine(file.FileName);
await Task.Run(() =>
{
Thread.Sleep(2000);
Console.WriteLine("======ASYNC======");
});
string msg = "i go there";
return RedirectToAction("Index");
}
因此,也许我失去了一些参考资料? 这是我的.cspjoj文件:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<UserSecretsId>bf953a4d-5fe0-4538-aeb5-27f9b4437de6</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EPPlus" Version="4.5.3.1" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\Upload\" />
</ItemGroup>
<ItemGroup>
<None Include="wwwroot\Templates\test.xlsx" />
</ItemGroup>
</Project>
当我按下“提交”按钮时,“网络(Dev Tools)”选项卡中的手表REST查询将运行。...addfile带有URL https:// localhost:44351 / home / addfile的 POST查询。 但是为什么会发生,我找不到。
UPD0。 添加并尝试了[HttpPost]方法属性。 没有结果
UPD1。 从浏览器添加了html,并从csproj文件添加了引用。
如果您没有指定对动作有效的HTTP动词,则MVC仅将其与GET请求匹配。 由于您是在表单中发出POST请求,因此它找不到匹配的操作(它正在寻找POST Home/UploadFile
而仅找到GET Home/UploadFile
)。
将HttpPost
属性添加到您的操作将对其进行修复。
[HttpPost]
public IActionResult UploadFile(IFormFile file)
{
...
}
一点注意事项:我建议您使用HttpClientFactory而不是自己创建HttpClient
。 与将客户端配置代码包含在您的操作中相比,它效率更高,也更清洁。
除了我以前的答案:
form
元素的asp-action
属性引用的是UploadFileAsync
方法,该方法在您的控制器中不存在,因为它实际上被称为UploadFile
(无异步)。 解决此问题将使您更进一步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.