c# - 如何在 ASP.NET MVC 3 中限制上传的文件大小并在超出时很好地弹出 ModelState 并显示适当的错误?

标签 c# javascript asp.net-mvc asp.net-mvc-3 modelstate

基本上我有一个带有文件输入的页面,允许最终用户上传一些文档。

我有一个看起来像这样的 Controller

public class MyController : Controller 
{
  [HttpPost]
  public ActionResult MyAction(MyViewModel model, HttpPostedFileBase document)
  { .. }
}

我想要实现的是:当用户尝试上传大于 maxContentLength 设置的文件时,应将验证错误添加到 ModelState 并将用户返回到他提交的表格所在的页面。在 ExceptionFilter 中处理错误并重定向到自定义页面不是解决方案。

最佳答案

您不能发送大于 maxContentLength 设置的请求。 Web 服务器会在请求到达您的应用程序之前终止此请求,并让您有可能处理此错误。因此,如果您想处理它,您必须将 maxContentLength 的值增加到一个相当大的数字,然后在您的 Controller 操作中检查上传文件的 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);
    }

    ...
}

但显然更简洁的解决方案是直接在您的 View 模型中处理它。您不需要 HttpPostedFileBase 参数。这就是 View 模型的用途:

public class MyViewModel
{ 
    [MaxFileSize(MAX_ALLOWED_SIZE)]
    public HttpPostedFileBase Document { get; set; }

    ... some other properties and stuff
}

其中 MaxFileSize 显然是您可以轻松实现的自定义属性。

现在您的 POST 操作变得更加标准:

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{ 
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    ...
}

你可以看看 following example我写了。

关于c# - 如何在 ASP.NET MVC 3 中限制上传的文件大小并在超出时很好地弹出 ModelState 并显示适当的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395601/

相关文章:

c# - MVC5 Controller 参数中的重音

c# - 如何关闭 Microsoft.Practices.EnterpriseLibrary.Data.ExecuteNonQuery 的连接

javascript - Fabric Js Canvas 中剪辑部分中的多个对象

javascript - JQuery - 在本地工作,但 $ 未定义,但仅在部署的站点上定义

c# - 所有业务逻辑都应该在域模型中还是?

C# 数组不适用于 for 循环

c# - 使用 RestSharp 轻松调用 Rest api

具有混合值类型的 JavaScript 数组排序 - 寻找合适的比较函数

javascript - Node - 无数据创建的 ES 索引

asp.net-mvc - ASP.Net MVC、动态属性和 EditorFor/LabelFor