Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心文件上载表单绑定问题_C#_Asp.net Core_File Upload_Asp.net Core Mvc - Fatal编程技术网

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

我尝试使用大量教程将视图的表单绑定到控制器的上载方法,例如:

因此,据我所知,如果我创建一个控制器和视图,所有这些都应该可以工作。 控制员:

(此处禁用异步,但两种情况下的结果相同)

所以,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");
        }
[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)
{
     ...
}