首先英语不是我的第一语言,但我会尽我所能......
我已经花了一个多小时来弄清楚如何在一个特定视图的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视图进行不同的上传,但如果你有想法,插件或其他任何东西,请告诉我。
坦克你非常糊涂答案 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;
}
}