【发布时间】: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