【发布时间】:2016-06-08 05:19:29
【问题描述】:
对不起,我的英语不好,但我正在努力变得更好。 现在没事了 我有一个内容/索引操作和视图。我有一个提交评论的表格,带有添加评论/评论部分和部分视图页面。现在我使用过滤器检查用户的插入时间。任何用户都允许在一分钟内插入评论。现在,如果用户插入第一条评论,我会在 OnActionExecuted 方法的缓存中保存一分钟,如果该用户再次插入另一条评论,我会在缓存中检查该用户缓存时间小于一分钟或否。 如果不到一分钟,我想在 ErrorController/IndexAction 中重定向用户 ... 但在 Child Action 中不起作用。例如,因为内容/索引页面中的 Commnet/AddComment 操作调用...我认为此方法是子操作,而不是在错误控制器中重定向。 但是我在内容/索引中使用此过滤器时..可以重定向到错误控制器。 我的过滤器:
public class ValidateSpamFilterAttribute : ActionFilterAttribute
{
public int Duration { get; set; }
public bool IsAddress { get; set; }
private string SecurityKey { get; set; }
public ValidateSpamFilterAttribute(int duration, bool isAddress)
{
Duration = duration;
IsAddress = isAddress;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
SecurityKey = CreateKey();
var objReadCache = HttpContext.Current.Cache;
if (objReadCache.Get(SecurityKey) != null)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary(new { controller = "Error", action = "Index", area = "", Exception = "بازه زمانی ثبت شما رعایت نشده است", ErrorCode = System.Net.HttpStatusCode.BadRequest, Handler = "Controller" }
)
);
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
base.OnActionExecuting(filterContext);
}
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
SecurityKey = CreateKey();
var SecurityValue = SecurityKey;
var SecurityTime = DateTime.Now.AddMinutes(Duration);
var SecurityExp = System.Web.Caching.Cache.NoSlidingExpiration;
var SecurityPri = System.Web.Caching.CacheItemPriority.Normal;
HttpContext.Current.Cache.Add(SecurityKey, SecurityValue, null, SecurityTime, SecurityExp, SecurityPri, null);
base.OnActionExecuted(filterContext);
}
private string CreateKey()
{
var IP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? HttpContext.Current.Request.UserHostAddress;
var Info = (this.IsAddress) ? (HttpContext.Current.Request.RawUrl + HttpContext.Current.Request.QueryString) : "";
var UniqueString = String.Concat(IP, Info);
var SecurityValue = string.Join("", System.Security.Cryptography.MD5.Create().ComputeHash(System.Text.Encoding.ASCII.GetBytes(UniqueString)).Select(s => s.ToString("x2")));
return SecurityValue;
}
}
首先我调用父控制器 .Content/Index
public ActionResult Index(int id, string title)
{
//anything
}
并加载我的 IndexPage。现在我加载评论/添加评论操作。
[ValidateSpamFilter(duration: 10, isAddress: true)]
// HttpPost Method For Submit Form . you can add comment by this method .
public ActionResult AddComment(CommentAddDTO Comments)
{
//addcomment ....
}
无论如何我的代码
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary(new { controller = "Error", action = "Index", area = "", Exception = "بازه زمانی ثبت شما رعایت نشده است", ErrorCode = System.Net.HttpStatusCode.BadRequest, Handler = "Controller" }
)
);
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
当我在子操作中使用此过滤器时,对我不起作用并且无法重定向到错误控制器。
【问题讨论】:
标签: c# asp.net-mvc filterattribute