Как я могу использовать базовый контроллер в ASP.NET для записи действий пользователя? - PullRequest
0 голосов
/ 16 мая 2018

Мне необходимо записывать действия пользователя, и я не хочу, чтобы код был в каждом методе, есть ли в каждом контроллере, имеет ли смысл каким-то образом делать это в basecontroller?ИЛИ есть ли лучший способ?

public class BaseController : Controller
{
    protected ILogger logger;

    public BaseController(ILogger<BaseController> logger)
    {
        this.logger = logger;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        //How do I get the current controller? 
        //How do I get the current method being called? 
        //How can I pass in additional parameters?
        //How can I get the user? 

        logger.LogWarning("Loaded BaseController");
        base.OnActionExecuting(context);
    }

}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Для получения имен контроллеров и действий вы можете использовать ActionDescriptor из ActionExecutingContext

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var descriptor = filterContext.ActionDescriptor;
    var actionName = descriptor.ActionName;
    var controllerName = descriptor.ControllerDescriptor.ControllerName;
    ......
    base.OnActionExecuting(filterContext);
}

Относительно информации пользователя : инициализация контроллера произойдет до авторизациипроисходит.Таким образом, все ваши контроллеры будут созданы до того, как произойдет любая OnAuthorization .

Подход для решения этих ситуаций заключается в использовании Фильтры действий .Атрибут Authorize запускается раньше, чем происходит инициализация контроллера.

Просмотрите следующие статьи:

0 голосов
/ 16 мая 2018

Есть много способов сделать это.

Первый : Вы можете создать свой собственный базовый контроллер и реализовать OnActionExecution, как и раньше.См. Образец ниже, чтобы получить информацию от ActionExecutingContext.

Если вы пойдете этим путем, каждый контроллер, который унаследует от этого базового контроллера, получит реализацию регистратора, потому что вы переопределяете OnActionExecuting (который применяется ко всем действиям вашего контроллера).

public override void OnActionExecuting(ActionExecutingContext context)
{
    //How do I get the current controller? 
    string controllerName = context.ActionDescriptor.ControllerDescriptor.ControllerName

    //How do I get the current method being called? 
    string actionName = context.ActionDescriptor.ActionName;

    //How can I pass in additional parameters?
    foreach (var parameter in context.ActionParameters)
    {
        var parameterKey = parameter.Key;
        var parameterValue = parameter.Value;
    }

    //How can I get the user? 
    var user = this.User; // IPrinciple instance, explore this object

    logger.LogWarning("Loaded BaseController");
    base.OnActionExecuting(context);
}

Секунда: С другой стороны, вы можете использовать ActionFilters , который наследует класс ActionFilter и выполняет ту же реализацию в этом классе, переопределяя OnActionExecuting.Затем вы можете украсить свои контроллеры этим атрибутом, чтобы сделать регистратор.Учитывая, что это атрибут, вы должны определить имя класса с суффиксом Attribute и использовать без него.Например:

public class LoggerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
       // same code above
    }
}

[Logger]
public class CustomerController : Controller
{
   // actions code...
}

Третий : используйте тот же класс фильтра действий и вместо применения ко всем нужным классам вы определяете его как глобальный фильтр действий, и он будет применяться квсе контроллеры.Вы должны определить его на GlobalFilter, и если вы используете шаблон по умолчанию asp.net mvc, вы можете определить его на FilterConfig.cs, для образца:

filters.Add(new LoggerAttribute());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...