asp.net MVC5 c#特定的上载限制由动作/控制器

本文关键字:控制器 上载 MVC5 net asp | 更新日期: 2023-09-27 17:50:02

英语不是我的第一语言,但我会尽我所能…

我花了一个多小时来弄清楚如何在web中应用maxRequestLength。

为特定视图配置meany route…

这是我的路线:

/{Controller}/{Action}/{id}
/{CategoryId}/{Controller}/{Action}/{id}

我想允许上传200Mb的只有特定的操作/视图,而不是在所有的应用程序。有些时候,同一个视图有不同的url,比如视图Item可以被AddItem和EditItem调用。

i was hopping我可以设置这个使用属性,像[AllowUpload(200)]所以我试过了,但这个设置是在MVC属性之前评估的。

我想做的是在网络上设置最大值。配置并注册一个过滤器属性来拒绝自定义属性中的操作。控制器看起来像这样:

[AllowUpload(1)]
public class MyController : Controller
{
    public ActionResult Index()
    {return View();}
    [AllowUpload(200)]
    public ActionResult Upload()
    {return View();}
}

我不知道如何做这个属性,以及控制器属性将如何被action属性覆盖。

我能想象的最好的方式是属性,因为我将有不同的上传权对任何可以有不同动作的视图,但如果你有一个想法,一个插件或其他任何东西,请告诉我。

非常感谢你

asp.net MVC5 c#特定的上载限制由动作/控制器

我终于知道该怎么做了。

我在webconfig上设置最大值,并为每个控制器添加一个ActionFilterAttribute。

我唯一需要确定的是总是检查ModelState。

属性代码如下:

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
public sealed class UploadActionAttribute : ActionFilterAttribute
{
    public UploadActionAttribute(double maxMb = 4d)
    {
        MaxMb = maxMb;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (ConvertBytesToMegabytes(filterContext.HttpContext.Request.ContentLength) > MaxMb)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult() { Data = new { Success = false, MaxContentLengthExceeded = true } };
            }
            else
                filterContext.Controller.ViewData.ModelState.AddModelError("", string.Format(CSRess.MaxRequestLengh, MaxMb));
        }
        base.OnActionExecuting(filterContext);
    }
    private double MaxMb { get; set; }
    static double ConvertBytesToMegabytes(long bytes)
    {
        return (bytes / 1024f) / 1024f;
    }
}