asp.net MVC5 C#按动作/控制器的特定上传限制

时间:2014-03-13 05:33:11

标签: c# asp.net-mvc asp.net-mvc-4 web-config custom-attributes

首先英语不是我的第一语言,但我会尽我所能......

我已经花了一个多小时来弄清楚如何在一个特定视图的web.config中应用maxRequestLength并使用了一些路线......

这是我的路线:

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

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

我希望仅允许在特定操作/视图上上传200Mb,而不是在所有应用程序中上传。有一段时间,同一个视图有不同的url,就像视图Item可以被AddItem和EditItem调用一样。

我在跳,我可以使用属性设置它,例如[AllowUpload(200)] 所以我试了但是这个设置是在MVC中的属性之前评估的。

我想要做的是在web.config上设置max并注册filter属性以拒绝自定义属性中的操作。控制器将如下所示:

[AllowUpload(1)]
public class MyController : Controller
{

    public ActionResult Index()
    {return View();}

    [AllowUpload(200)]
    public ActionResult Upload()
    {return View();}

}

我不知道如何执行此属性以及action属性将如何覆盖控制器属性。

我能想象的最好的方法是属性,因为我会对可以有不同操作的meany视图进行不同的上传,但如果你有想法,插件或其他任何东西,请告诉我。

坦克你非常糊涂

1 个答案:

答案 0 :(得分:1)

我终于找到了如何做到这一点。

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

我唯一需要确定的是始终在控制器的操作中检查ModelState.IsValid。

这是属性代码:

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