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