简体   繁体   中英

ASP.NET Core Web Application using .NET 5.0: IFormFile always null when passing from view to controller

I am trying to allow the user to upload a pdf file. I am not getting any errors, but the IFormFile 'PostedFile' is always null in the controller.

Create View:

 <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>

Controller, Create method:

[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);
}

PLEASE NOTE: I (think I) do NOT want to use List as I do NOT want the user to be able to upload more than 1 single document at a time as the documents have a corresponding database entries with a 1 to 1 relationship.

I have a few questions.

1.) What is the problem? Why is IFormFile always null? 2.) Why does it seem like people always recommend List over IFormFile?

Passing the rest of the variables to the controller works fine:

<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>

But the file upload div is still inside of the form that is directed to the Create method. Is there something wrong with the view element? If so how would I change it to correct the issue?

I tried following this example and got no errors but no results either: https://www.aspsnippets.com/Articles/ASPNet-Core-IFormFile-always-returns-NULL.aspx

You need use enctype=multipart/form-data to allows entire files to be included in the data.Like following.

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

Action:

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

Result: 在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM