簡體   English   中英

ASP.NET Core文件上傳表單綁定問題

[英]ASP.NET Core file upload form binding problems

我嘗試使用大量教程將視圖的表單綁定到控制器的上傳方法,例如:

因此,據我了解,如果我創建一個控制器並進行查看,那么所有這些都應該工作。 控制器:

(此處禁用了異步功能,但在兩種情況下結果都是相同的)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM