为什么我的自定义过滤器在 .NET Core 6.0 中没有被 servicefilter 或 typefilter 调用?

问题描述 投票:0回答:1

我对以下代码有问题。我尝试通过对构造函数的依赖项注入来实现自定义操作过滤器。

我按照本教程的确切方式进行操作,但我的自定义过滤器甚至没有被调用。

https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-7.0#ifilterfactory

这是我迄今为止所实施的:

自定义过滤器.cs

public class CustomFilter : IActionFilter
{
    private readonly UserManager<Kullanici> _userManager;

    public CustomFilter(UserManager<Kullanici> userManager) 
    { 
        _userManager = userManager;  
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        var user = _userManager.GetUserAsync(context.HttpContext.User).Result;

        if (user.KullaniciTipi != Models.Enums.KullaniciTipi.Mezun)
        {
            var controller = context.Controller as Controller;
            controller.TempData["ErrorMessage"] = "Erişim hakkınız bulunmamaktadır.";
            context.HttpContext.Response.Redirect("/");
        }
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
    }
}

我的控制器中的操作方法:

[ServiceFilter(typeof(CustomFilter))]
public async Task<IActionResult> Profil()
{
    var user = await _userManager.GetUserAsync(HttpContext.User);
    var mezunHesabi = user.MezunHesabi;

    ProfilViewModel profilViewModel = new ProfilViewModel();
    profilViewModel.MapFromModel(mezunHesabi);

    return View(profilViewModel);
}

还有我的

program.cs
文件:

builder.Services.AddScoped<CustomFilter>();

非常感谢任何帮助。

我希望调用我的自定义过滤器,但没有被调用,我遵循了所有必需的步骤,缺少什么?

c# asp.net-core action-filter
1个回答
1
投票

我应该将我的代码放在 OnActionExecuting 而不是 OnActionExecuted 中。

public class CustomFilter : IActionFilter
{
    private readonly UserManager<Kullanici> _userManager;

    public CustomFilter(UserManager<Kullanici> userManager) 
    { 
        _userManager = userManager;  
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        var user = _userManager.GetUserAsync(context.HttpContext.User).Result;
        if (user.KullaniciTipi != Models.Enums.KullaniciTipi.Mezun)
        {
            var controller = context.Controller as Controller;
            controller.TempData["ErrorMessage"] = "Erişim hakkınız bulunmamaktadır.";
            context.Result = new RedirectToActionResult(actionName: "Index", controllerName: "Home", null);
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.