当我们处于OnActionExecuting时,如何重定向到另一个控制器

时间:2016-06-08 05:19:30

标签: c# asp.net-mvc filterattribute

请原谅我的英语不好,但我想要变得更好。 现在可以 我有一个内容/索引操作和视图。我有一个表单用于提交评论与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中使用此过滤器时,无法为我工作,无法重定向到错误控制器。

1 个答案:

答案 0 :(得分:0)

我使用下面的代码重定向到onActionExecuting的其他控制器:

  

filterContext.Result = new RedirectToRouteResult(“Default”,new   System.Web.Routing.RouteValueDictionary {{“controller”,“Error”},{   “行动”,“指数”}});

希望这会有所帮助..