C# 在ASP.NET MVC 3中,如何限制上传时的文件大小,并在超出时以适当的错误很好地弹出ModelState?
基本上,我有一个带有文件输入的页面,允许最终用户上传一些文档 我有一个控制器,看起来像这样C# 在ASP.NET MVC 3中,如何限制上传时的文件大小,并在超出时以适当的错误很好地弹出ModelState?,c#,javascript,asp.net-mvc,asp.net-mvc-3,modelstate,C#,Javascript,Asp.net Mvc,Asp.net Mvc 3,Modelstate,基本上,我有一个带有文件输入的页面,允许最终用户上传一些文档 我有一个控制器,看起来像这样 我想要实现的是:当用户尝试上载大于maxContentLength设置允许的文件时,应将验证错误添加到ModelState,并将用户返回到提交表单的页面。在例外筛选器中处理错误并重定向到自定义页面不是解决方案。您不能发送大于maxContentLength设置的请求。web服务器将在该请求到达您的应用程序之前终止该请求,并使您有可能处理此错误。因此,如果您想处理它,您必须将maxContentLengt
我想要实现的是:当用户尝试上载大于maxContentLength设置允许的文件时,应将验证错误添加到ModelState,并将用户返回到提交表单的页面。在例外筛选器中处理错误并重定向到自定义页面不是解决方案。您不能发送大于
maxContentLength
设置的请求。web服务器将在该请求到达您的应用程序之前终止该请求,并使您有可能处理此错误。因此,如果您想处理它,您必须将maxContentLength
的值增加到一个合理的大数值,然后在控制器操作中检查上传文件的ContentLength
[HttpPost]
public ActionResult MyAction(MyViewModel model, HttpPostedFileBase document)
{
if (document != null && document.ContentLength > MAX_ALLOWED_SIZE)
{
ModelState.AddModelError("document", "your file size exceeds the maximum allowed file size")
return View(model);
}
...
}
但显然,一个更干净的解决方案是在视图模型中直接处理这个问题。您不需要HttpPostedFileBase参数。这就是视图模型的用途:
public class MyViewModel
{
[MaxFileSize(MAX_ALLOWED_SIZE)]
public HttpPostedFileBase Document { get; set; }
... some other properties and stuff
}
其中MaxFileSize显然是一个可以轻松实现的自定义属性
现在,您的后期操作变得更加标准:
[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
...
}
您可以看看我写的。我尝试的另一件事是:当用户更改文件输入的值时,我启动一个异步上传到服务器。如果异步上传失败-我不允许用户提交父表单,如果异步上传成功(收到HTTP 200),我将允许他提交表单,假设第二次上传也会成功。Darin,你的例子对我帮助很大。还有一点需要注意:如果内容长度大于web.config中指定的长度,或者服务器将返回404.13的响应代码,这有时可能会导致误读。
[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
...
}