1

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

我有一个看起来像这样的控制器

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

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

4

1 回答 1

3

您不能发送大于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 显然是您可以轻松实现的自定义属性。

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

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

    ...
}

你可以看看我写的下面的例子。

于 2012-07-09T13:06:11.700 回答