Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC 3中,如何限制上传时的文件大小,并在超出时以适当的错误很好地弹出ModelState?_C#_Javascript_Asp.net Mvc_Asp.net Mvc 3_Modelstate - Fatal编程技术网

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);
    }

    ...
}