IFormFile始终为null(ASP.NET Core with MVC/Razor)

C.H*_*.H. 12 c# asp.net-mvc asp.net-core-mvc

我有一个ASP.NET Core MVC应用程序试图上传IFormFile.但是,IFormFile始终为null.我发现的其他解决方案都没有解决这个问题.我究竟做错了什么?

模型

public class EmailForm
{
    [Display(Name = "Add a picture")]
    [DataType(DataType.Upload)]
    [FileExtensions(Extensions = "jpg,png,gif,jpeg,bmp,svg")]
    public IFormFile SubmitterPicture { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调节器

public async Task<ActionResult> Contribute([Bind("SubmitterPicture")] EmailForm model)
{
    if (ModelState.IsValid)
    {
        //Do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

视图

        <form method="post" asp-action="Contribute" asp-antiforgery="true" enctype="multipart/form-data" >
            <div class="form-group" >
                <div class="col-md-2">@Html.LabelFor(m => m.SubmitterPicture)</div>
                <div class="col-md-4">
                    <input type="file" name="SubmitterPicture" id="SubmitterPicture" />
    </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" class="btn btn-default" value="Contribute" />
                </div>
            </div>
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 18

<form method="post" enctype="multipart/form-data">
</form>
Run Code Online (Sandbox Code Playgroud)

ENCTYPE ="多部分/格式数据"

多部分表单数据是关键.

  • 问题中的代码已经有 enctype="multipart/form-data (2认同)

Tra*_*ent 11

您也可以从 中获取文件HttpContext.Request.Form.Files并删除IFormFile模型中的接口。我推荐这种方法,因为我相信文件与数据模型无关。

这个例子是:

public IActionResult Index()
{
    //Please note that if no form data is posted
    // HttpContext.Request.Form will throw an exception
    if (HttpContext.Request.Form.Files[0] != null) {
        var file = HttpContext.Request.Form.Files[0];
        using (FileStream fs = new FileStream("Your Path", FileMode.CreateNew, FileAccess.Write, FileShare.Write)) {
            file.CopyTo(fs);
        }
    }
    return View();
}
Run Code Online (Sandbox Code Playgroud)

如果此方法也失败,则表示multipart请求有问题。


Met*_*t-u 5

在同一个问题上坐了几个小时后,我找到了解决方案。

问题:

提交表单中的单个输入。

结论:

基本上在您的html表单中,如果除了“提交”按钮之外仅输入一个内容,则此功能将无效。一旦我在viewModel上添加了另一个属性以及表单中的另一个输入,我的属性不再为null。

我希望这可以帮助其他人。

剃刀页面HTML:

@page
@model SomeModel

<form method="post" enctype="multipart/form-data">
    <div class="form-group">
        <div class="col-md-10">
            <p>Upload one or more files using this form:</p>
            <input asp-for="Input.SingleInput" type="file" class="form-control" />
            <input asp-for="Input.AnotherInput" class="form-control" />
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-10">
            <input type="submit" value="Upload" />
        </div>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

后面的剃刀页面代码:

public class SomeModel: PageModel
    {
        [BindProperty]
        public SomeViewModel Input { get; set; }

        public async Task OnGetAsync()
        {

        }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            // This won't be null.
            var showMeSomething = Input.SingleInput;

            return RedirectToPage();
        }
    }
Run Code Online (Sandbox Code Playgroud)

SomeViewModel:

public class SomeViewModel
    {
        public IFormFile SingleInput{ get; set; }
        public string AnotherInput{ get; set; }
    }
Run Code Online (Sandbox Code Playgroud)