请原谅我的英语不好,但我想要变得更好。 现在可以 我有一个内容/索引操作和视图。我有一个表单用于提交评论与addcomment / Comment partial和partialview页面。现在我使用过滤器来检查用户的插入时间。任何用户都允许在一分钟内插入评论。现在,如果用户插入第一条评论,我在OnActionExecuted方法的缓存中保存一分钟,如果此用户再次插入另一条评论,我检查缓存中该用户缓存时间小于一分钟或否。 如果不到一分钟我想在ErrorController / IndexAction中重定向用户... 但是没有参与儿童行动。例如因为Commnet / AddComment Action在Content / Index Page中调用...我认为这个方法是子操作而不是在Error控制器中重定向。 但我在内容/索引中使用此过滤器时,可以重定向到错误控制器。 我的过滤器:
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;
}
}
首先我调用父控制器。内容/索引
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);
当我在Child Action中使用此过滤器时,无法为我工作,无法重定向到错误控制器。
答案 0 :(得分:0)
我使用下面的代码重定向到onActionExecuting的其他控制器:
filterContext.Result = new RedirectToRouteResult(“Default”,new System.Web.Routing.RouteValueDictionary {{“controller”,“Error”},{ “行动”,“指数”}});
希望这会有所帮助..