【问题标题】:ASPNET core. Exclude global filter for a specific ActionASPNET 核心。排除特定操作的全局过滤器
【发布时间】:2021-02-17 06:16:49
【问题描述】:

我有一个全局 ActionFilter,它检查布尔值的状态,如果为 False,则返回禁用页面

       public void OnActionExecuting(ActionExecutingContext context)
        {
           var school = dbcontext.School.Take(1).FirstOrDefault();
            if (school != null)
            {
                // if school status is False, return to Disable page
                if (!school.Status)
                {
                    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                    redirectTargetDictionary.Add("action", "Disabled");
                    redirectTargetDictionary.Add("controller", "App");
                    redirectTargetDictionary.Add("area", "");
                    context.Result = new RedirectToRouteResult(redirectTargetDictionary);
                    context.Result.ExecuteResultAsync(context);
                }
             }
         }

我已注册此过滤器以应用于所有控制器操作。

            services.AddControllersWithViews(options =>
            {
                options.Filters.Add(typeof(FeatureFilter));
            });

我有一个动作方法,可以将学校状态从真到假,从假到真。

        [Route("disable")]
        public IActionResult ChangeStatus()
        {
            var school = context.School.FirstOrDefault();
            bool status = school.Status;
            school.Status = !status;
            context.School.Update(school);
            string message = status ? "disabled" : "enabled";
            context.SaveChanges();
            return Json($"Ok this school has been {message} ");

        }

所以我面临的问题是我无法将状态更改回 True,因为当 School Status 为 false 时,ActionFilter 会将我重定向到 Disabled 页面。

【问题讨论】:

  • context 将提供路线等信息。您可以在此处添加if
  • 对于可重复使用的解决方案,您可以创建另一个名为 IgnoreStatus 或其他名称的过滤器,然后检查此过滤器是否适用于现有操作过滤器中的当前操作,例如 if (!school.Status && !context.ActionDescriptor.IsDefined(typeof(IgnoreStatusAttribute))跨度>

标签: c# asp.net-core action-filter


【解决方案1】:

尝试改变

if (!school.Status)

if (!school.Status&&!context.HttpContext.Request.Path.ToString().Equals("/ControllerName/ActionName"))

这样当你调用操作时,actionfilter 不会转到 DisabledPage。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2012-10-05
    • 1970-01-01
    • 2019-12-13
    相关资源
    最近更新 更多