我尝试使@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)
工作?还是有一些类似的方法可以通过文件上传来制作表单?
答案 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-action
和asp-controller
属性。这将由内置的FormTagHelper
处理,并且将为您生成正确的操作。
FWIW,同样适用于您的输入。除了EditorFor
之外,您还可以执行以下操作:
<input asp-for="file" />
InputTagHelper
将填写其他所有内容。