问题描述
这是我的行动
[HttpGet]
[Authorize(Roles = "AccountExecutive")]
public async Task<IActionResult> Index()
{
var me = await _userManager.GetUserAsync(HttpContext.User);
var companyContactsviewmodel = new Contactsviewmodel(me);
return View(companyContactsviewmodel);
}
现在尝试
public class ProfilerequiredActionFilter : ActionFilterattribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
}
}
Startup.cs
services.AddMvc(options=> {
options.Filters.Add<ProfilerequiredActionFilter>();
})
但是在过滤器中,我无法使用Usermanager,因此无法获取Currnet用户详细信息
我也想在Razor页面视图中做同样的事情
解决方法
如果要在ActionFilter中使用UserManager,可以将UserManager注入其中:
public class ProfileRequiredActionFilter : ActionFilterAttribute
{
private UserManager<IdentityUser> _userManager;
public ProfileRequiredActionFilter(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
}
}
在剃须刀页面中没有动作过滤器。您可以使用IAsyncPageFilter并判断其中的处理程序方法的名称:
using Microsoft.Extensions.DependencyInjection;
public class CustomPageFilter : IAsyncPageFilter
{
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,PageHandlerExecutionDelegate next)
{
if (context.HandlerMethod?.Name == "Update")
{
// Running inside a handler method named "Update".
var svc = context.HttpContext.RequestServices;
var usermanager = svc.GetService<UserManager<IdentityUser>>();
}
}
Task IAsyncPageFilter.OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
return Task.CompletedTask;
}
}
startup.cs:
services.AddRazorPages().AddMvcOptions(options =>
{
options.Filters.Add(new CustomPageFilter());
});