0

我创建了一个BaseController在我的 ASP.NET Core 6 项目中调用的基本控制器类,其中包括我在其他控制器中需要的一些基本功能。我还在其中的OnActionExecutionAsync方法中运行了一些额外的代码,BaseController否则我必须在每个控制器操作中运行这些代码。但是,在极少数情况下,我不想在操作之前运行此代码。一个示例是任何与身份验证/登录相关的操作。有没有一种方法可以让我跳过通过OnActionExecutionAsync特定控制器操作运行附加代码?我正在考虑类似于我可以[AllowAnonymous]用来允许未经身份验证的用户访问特定操作的方法。

4

1 回答 1

1

不知道你是如何设计你的,但如果你想在动作执行之前做任何事情,BaseController我们通常会自定义动作过滤器。

第一种方式,您可以自定义ActionFilterAttribute并在要运行任何其他附加代码的操作上添加此属性。

public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var controllerName = context.RouteData.Values["controller"].ToString();
        string action = context.RouteData.Values["action"].ToString();
       //xxxxxxx.Query["YourQueryStringName"].....
        var query = context.HttpContext.Request.Query["tenantID"].ToString();

       //do your stuff....
    }
}

控制器:

public class TestController:BaseController
{
    [CustomActionFilter]
    public IActionResult Index()
    {
        return Ok();
    }
}

第二种方式,你可以在方法中获取你的请求控制器和动作名称,使它们成为条件:</p>

public class CustomActionFilter: IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var controllerName = context.RouteData.Values["controller"].ToString();
        string action = context.RouteData.Values["action"].ToString();
        if(controllerName!="xxx"&&action!="xxx")
        {
            //do your stuff...
        }
    }
    public void OnActionExecuted(ActionExecutedContext context)
    {
        
    }
}

笔记:

如果要获取控制器和操作值,请确保配置路由模板,如下所示:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
于 2022-01-14T06:00:24.630 回答