我试图在MVC 5中完成我的第一个简单文件上传。我跟随了一些我发现的例子,但出于某种原因,在我的"创建" ActionResult uploadFile总是以NULL形式进入,因此上传代码永远不会运行。有人看到我可能做错了吗?
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Documents.</h2>
<h4>Upload a new document.</h4>
<div class="well">
@using (Html.BeginForm("Create", "Documents", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<h3>Select a file to upload. </h3>
<input type="file" name="files" value="" multiple="multiple" />
<input type="submit" value="Upload your file" title="Upload" />
<div style="color:Red;font-size:14px">@ViewBag.Message</div>
}
</div>
这是我的控制器:
// POST: Documents/Create
[HttpPost]
public ActionResult Create(HttpPostedFileBase uploadFile)
{
try
{
if(uploadFile != null && uploadFile.ContentLength > 0)
{
string filePath = Server.MapPath("../SiteDocuments" + uploadFile.FileName);
uploadFile.SaveAs(filePath);
}
return RedirectToAction("Index");
}
catch (Exception ex)
{
return View();
}
}
答案 0 :(得分:2)
您的文件输入元素的名称应与您的操作方法参数名称匹配。
因此,请更新HTML标记,使其具有相同的name
属性值。
<input type="file" name="uploadFile" value="" multiple="multiple" />
,你的行动方法将是
[HttpPost]
public ActionResult Create(HttpPostedFileBase uploadFile)
{
// do something
}
或更改操作方法参数名称以匹配文件输入元素名称。
<input type="file" name="files" value="" multiple="multiple" />
,你的行动方法将是
[HttpPost]
public ActionResult Create(HttpPostedFileBase files)
{
if(files!= null && files.ContentLength > 0)
{
// do something
}
}
当您将multiple="multiple"
属性添加到input元素时,浏览器将允许最终用户一次选择多个文件。在这种情况下,如果您的action方法参数是HttpPostedFileBase
对象的单个实例,它将从选定的n
文件接收第一个文件。如果您想要所有文件,可以将参数更改为集合,例如
[HttpPost]
public ActionResult Create(IEnumerable<HttpPostedFileBase> files)
{
if (files != null && files.Any())
{
foreach (var file in files)
{
if (file.ContentLength > 0)
{
//do something
}
}
}
}