【问题标题】:How to redirect to another controller when we are in OnActionExecuting当我们在 OnActionExecuting 时如何重定向到另一个控制器
【发布时间】: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


    【解决方案1】:

    我正在使用以下代码重定向到其他控制器 onActionExecuting:

    filterContext.Result = new RedirectToRouteResult("默认", new System.Web.Routing.RouteValueDictionary { {“控制器”,“错误”},{ "动作", "索引" } });

    希望这会有所帮助..

    【讨论】:

    • 我的重定向代码与您的代码没有区别。两个代码都可以正常工作。但我的问题是这段代码只能用于主要操作,不能用于发布操作或部分视图结果操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多