@ html.EditorFor asp.net核心不适用于文件

时间:2018-09-14 12:43:38

标签: c# asp.net-core

我尝试使@Html.EditorFor(model => model.file)可以在我的ASP.NET Core应用程序中将文件放在网页上(文件为IFormFile类型)。但是文件是null,由于某种原因,当我单击“提交”时,就会出现异常。对于字符串,一切正常。这是HTML代码:

@using (Html.BeginForm("tt", "Home", FormMethod.Post))
{
    <div class="row">
        <div class="col-md-4">                
            @Html.EditorFor(model => model.file)
        </div>
        <div class="col-md-8">
            <button type="submit" id="btnUpload" class="btn btn-primary">Upload</button>                
        </div>
    </div>
    <br />
    <div>@Html.DisplayFor(model => model.content)</div>        
}

控制器代码:

public ActionResult tt(Models.FileInfo f)
{
    var r = f.content1 + f.file.FileName;

    f.content = r;
    return View("Demo_index", f);
}

和型号:

public class FileInfo
{
    public IFormFile file { get; set; }
    public string content { get; set; }
    public string content1 { get; set; }
}

是否可以使@Html.EditorFor(model => model.file)工作?还是有一些类似的方法可以通过文件上传来制作表单?

1 个答案:

答案 0 :(得分:2)

问题是您以x-www-form-urlencoded的身份发布,不支持文件上传。您需要使用multipart/form-data来代替,这可以通过向表单标签添加enctype属性来实现:

<form ... enctype="multipart/form-data">

使用Html.BeginForm可以做到这一点,但是您必须使用一个重载,该重载需要指定大量参数,这比它的价值更痛苦。此外,在Core中,无论如何,使用标签助手会更好。从字面上看,您需要的是:

<form asp-action="tt" asp-controller="Home" method="post" enctype="multipart/form-data">
    ...
</form>

如果您要进行回发,即到已经存在的同一页面,则可以完全删除asp-actionasp-controller属性。这将由内置的FormTagHelper处理,并且将为您生成正确的操作。

FWIW,同样适用于您的输入。除了EditorFor之外,您还可以执行以下操作:

<input asp-for="file" />

InputTagHelper将填写其他所有内容。