Как ActionFilterAttribute может получить доступ к защищенному int?из BaseController? - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть базовый контроллер, единственная цель которого - получить значение int из HttpContext.Session и сделать его доступным для всех наследующих контроллеров.

Теперь я пытаюсь перенаправить в представление входа в систему, когдауказанное значение не установлено, и пользователь пытается получить доступ к ограниченному представлению без входа в систему.

Это то, что я получил до сих пор:

public class BaseController : Controller
{
    protected int? BranchId
    {
        get { return (HttpContext.Session.GetInt32("BranchId") as int?); }
        set {}
    }

    public BaseController() {}
}

public class RedirectingActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (BranchId < 1) // BUT BranchId DOES NOT EXIST IN THIS CONTEXT
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Login"
            }));
        }
    }
}

public class EmployeesController : BaseController
{
    private readonly VaktlisteContext db;
    private readonly IMapper auto;

    public EmployeesController(VaktlisteContext context, IMapper mapper)
    {
        db = context;
        auto = mapper;
    }

    [RedirectingAction]
    public async Task<IActionResult> Index()
    {
        Branch branch = await db.Branches.Include(e => e.Employees)
            .Where(b => b.Id == BranchId).FirstOrDefaultAsync();
        if (branch == null) return NotFound();
        BranchViewModel vm = auto.Map<BranchViewModel>(branch);
        return View(vm);
    }
}

Я прочитал на этот вопрос и ответ , но не смог понять, как решение может быть применимо в моем случае.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Защищенный объект защищен, когда вы определили свойство как защищенный доступ, то вы не можете ожидать, что к нему получите доступ в производном классе !!.

Но о доступе к свойству в действии

public class ValidateActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.Controller as BaseController ; 
        if (controller == null)
        {
            throw new InvalidOperationException("It is not EmployeesController!");
        } 
        var propVal= controller.PropertyName;  
        //check propVal here
    }
}

но вы также можете использовать Session как context.HttpContext.Session в ActionFilter

0 голосов
/ 29 декабря 2018

вы не можете получить доступ к атрибуту BranchId в классе RedirectingActionAttribute напрямую, потому что он является членом класса BaseController.попробуйте этот код:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);

    if ((filterContext.Controller as BaseController).BranchId < 1) 
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
        {
            controller = "Home",
            action = "Login"
        }));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...