【问题标题】:ASP.NET Core Web Application using .NET 5.0: IFormFile always null when passing from view to controller使用 .NET 5.0 的 ASP.NET Core Web 应用程序:从视图传递到控制器时,IFormFile 始终为空
【发布时间】:2021-04-26 07:21:29
【问题描述】:

我正在尝试允许用户上传 pdf 文件。我没有收到任何错误,但控制器中的 IFormFile 'PostedFile' 始终为空。

创建视图:

 <div class="form-group">
      <label asp-for="PostedFile" class="control-label"></label>
      <div class="col-md-10">
           <input type="file" asp-for="PostedFile" />
           <span asp-validation-for="PostedFile" class="text-danger"></span>
      </div>

控制器,创建方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,Name,Phone1,Phone2,District_Division,OrgNumber,DateOfTest,DateOfExposure,NumberOfExposed,Notes,PathToFile")] Case_Log case_Log, IFormFile PostedFile)
{
    string path = "Case_Log_Docs/";
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
        System.Diagnostics.Debug.WriteLine("Created the folder.");
    }

    if (PostedFile != null)
    {
        string fileName = Path.GetFileName(PostedFile.FileName);
        System.Diagnostics.Debug.WriteLine(fileName);
        PostedFile.CopyTo(new FileStream(path, FileMode.Create));
        ViewBag.Message += string.Format("<b>{0}</b> uploaded.<br />", fileName);
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Posted file was null.");
    }

    if (ModelState.IsValid)
    {
        _context.Add(case_Log);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(case_Log);
}

请注意:我(我认为我)不想使用列表,因为我不希望用户一次能够上传超过 1 个文档,因为这些文档有一个对应的数据库条目,具有 1 到 1关系。

我有几个问题。

1.) 有什么问题?为什么 IFormFile 总是为空? 2.) 为什么人们似乎总是推荐 List 而不是 IFormFile?

将其余变量传递给控制器​​可以正常工作:

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"> </div>
    <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Phone1" class="control-label"></label>
        <input asp-for="Phone1" class="form-control" />
        <span asp-validation-for="Phone1" class="text-danger"></span>
    </div>

但文件上传 div 仍然在指向 Create 方法的表单内。视图元素有问题吗?如果是这样,我将如何更改它以纠正问题?

我尝试按照这个示例进行操作,没有错误但也没有结果:https://www.aspsnippets.com/Articles/ASPNet-Core-IFormFile-always-returns-NULL.aspx

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core model-view-controller file-upload


    【解决方案1】:

    您需要使用enctype=multipart/form-data 来允许将整个文件包含在数据中。如下所示。

    <form asp-action="xxx" enctype="multipart/form-data">
     //...
        <input type="file" name="PostedFile" />
        <input type="submit" value="click"/>
    </form>
    

    行动:

    [HttpPost]
    public IActionResult Demo(IFormFile PostedFile)
     {
        //...
     }
    

    结果:

    【讨论】:

    • 我认为这是正确的,但现在我遇到了指向我试图保存文件的文件夹的未经授权的访问问题。不过我会接受答案,谢谢!
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多