我遇到了ASP.NET MVC 3中文件上传最奇怪的问题。当我使用Razor使用默认项目模板(Internet应用程序)启动一个新项目时,将以下内容添加到/views/home/index.cshtml
<form action="/Home/Index" method="post" enctype="multipart/form-data">
<input type="file" name="upfile" />
<input type="submit" value="post" />
</form>
每当我尝试上传文件时,上传失败(firebug显示状态'Aborted')。一些额外的信息:
控制器代码:
public class HomeController : Controller {
public ActionResult Index() {
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About() {
return View();
}
}
我已经调试了一下,已经发现了以下内容:
有没有其他人遇到过这个问题,是什么导致了这个问题?
更新:我知道我应该使用单独的操作并用HttpPost标记它,这不是我问这个问题的原因。我正在寻找原因为什么这不起作用,而不是如何解决它。
答案 0 :(得分:1)
没有看到你的代码,我假设你有一个HttpGet的方法你的默认/ home / index
你需要在某个地方发布,这不是你的控制器方法。你应该有一个单独的[HttpPost]方法(用于post / get / update / delete的独立控制器方法)
编辑澄清: 为您的帖子操作创建单独的方法。你不应该为get / post共享相同的方法。 您还要从帖子中返回一个视图。通常也不建议这样做,因为MVC期望PRG(重定向后获取)行为,因此理想情况下您希望在完成后重定向回动作。 此处也支持使用Post(以及网上的许多其他帖子)
在上面的情况下,它可以正常工作,因为它没有验证,但如果你在文件上传之前在页面上有验证,如果你回发并且不重定向回动作就很容易变得愚蠢。
答案 1 :(得分:0)
强烈建议使用单独的操作来处理文件上传:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(HttpPostedFileBase upfile)
{
// TODO: process the uploaded file here
if (upfile != null && upfile.ContentLength > 0)
{
var fileName = Path.GetFileName(upfile.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
upfile.SaveAs(path);
}
return RedirectToAction("Index");
}
}
另外请务必查看following blog post。
答案 2 :(得分:0)
您是否确定在Web.config中正确设置了MaxRequestStringLength?
当我遇到这个时,这通常是个问题。