C# ASP.NET核心文件上载表单绑定问题
我尝试使用大量教程将视图的表单绑定到控制器的上载方法,例如:C# ASP.NET核心文件上载表单绑定问题,c#,asp.net-core,file-upload,asp.net-core-mvc,C#,Asp.net Core,File Upload,Asp.net Core Mvc,我尝试使用大量教程将视图的表单绑定到控制器的上载方法,例如: 因此,据我所知,如果我创建一个控制器和视图,所有这些都应该可以工作。 控制员: (此处禁用异步,但两种情况下的结果相同) 所以,Razor似乎不起作用,异步方法UploadFile也没有启动 [HttpPost] public async Task<IActionResult> UploadFile(IFormFile file) { Console.Wri
[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");
}
[HttpPost]
公共异步任务上载文件(IFormFile)
{
Console.WriteLine(“==========上传========”);
Console.WriteLine(file.FileName);
等待任务。运行(()=>
{
《睡眠》(2000年);
Console.WriteLine(“=======ASYNC=============”);
});
string msg=“我去那里”;
返回操作(“索引”);
}
那么,也许我丢失了一些参考资料?这是我的.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>
netcoreapp2.2
bf953a4d-5fe0-4538-aeb5-27f9b4437de6
当我按下submit按钮时,网络(开发工具)选项卡中的一个监视REST查询,它会运行。。。。使用URL添加文件POST查询。但为什么会这样,我找不到 UPD0。添加并尝试了[HttpPost]方法属性。没有结果
UPD1。添加了来自浏览器的html和来自csproj文件的引用。如果您没有指定哪些HTTP谓词对操作有效,MVC将仅对GET请求匹配它。由于您在表单中发出POST请求,因此它找不到匹配的操作(它正在查找
POST Home/UploadFile
,但只查找GET Home/UploadFile
)
将HttpPost
属性添加到您的操作将修复它
[HttpPost]
public IActionResult UploadFile(IFormFile file)
{
...
}
有一点小提示:我建议您使用而不是自己创建
HttpClient
。它比在您的操作中使用客户机配置代码更高效、更干净 除了我先前的回答之外:
form
元素的asp action
属性引用了UploadFileAsync
方法,该方法在控制器中不存在,因为它实际上被称为UploadFile
(无异步)。修复此问题将使您更进一步。您好。谢谢,但我也尝试添加[HttpPost]属性,检查了异步和同步调用-仍然没有结果。也许,当我有工作应用程序的时候,我会考虑使用HTTPclipse工厂。但现在我只需要这个简单的应用程序就可以了。听起来你的标签助手可能没有运行。检查浏览器的开发人员工具,查看那些asp控制器
和asp操作
属性是否已转换为有效的操作
属性。@KirkLarkin感谢您的建议。你能给我看一个有效的动作属性示例吗?它就像/Home/UploadFile
@KirkLarkin似乎标记转换根本不起作用。@KirkLarkin最后,我找到了一个解决方案。你是对的,标签助手不起作用。我将@addTagHelper*、Microsoft.AspNetCore.Mvc.TagHelpers
添加到我的cshtml顶部,助手开始工作!我要求您编写一个answerI未注释异步方法(请参见更新的问题),添加一些2s任务-仍然没有结果。我建议您更正cshtml文件中的操作名称,从中删除async
后缀。找不到您正在引用的操作,因为它不存在。您的问题与实际异步或同步的方法完全无关。谢谢。这也是问题所在,但不是主要原因
[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");
}
<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>
[HttpPost]
public IActionResult UploadFile(IFormFile file)
{
...
}