передать значение, возвращаемое методом в фильтр действий - PullRequest
0 голосов
/ 24 января 2020

Я ввел _serviceOne в мой контроллер, у которого есть метод, который возвращает значение int. Я пытаюсь передать это значение в свой фильтр пользовательских действий.

Это не работает, и я получаю сообщение об ошибке: An object reference is required for the non-static field, method, or property 'NameController._serviceOne', где я пытаюсь установить Number = _serviceOne.GetIntNumber.

Я знаю, что могу получить доступ к значению, если оно находится внутри контроллера (например: параметр контроллера, ViewBag, ViewData, переменная в контроллере), но я хочу передать значение в свойство Number фильтра CustomActionFilter .

Фильтр и метод обслуживания работают так, как я хочу, но он не позволит мне передать значение из _serviceOne.GetIntNumber в фильтр. Почему это не работает, и как я могу заставить его работать?

NameController.cs:

public class NameController : Controller
{
    private readonly ServiceOne _serviceOne;

    public NameController(ServiceOne serviceOne)
    {
        _serviceOne = serviceOne;
    }

    [CustomActionFilter(Name = "CorrectName", Number = _serviceOne.GetIntNumber)] //does not work
    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }
}

CustomActionFilter.cs:

public class CustomActionFilter : ActionFilterAttribute
{
    public string Name { get; set; }
    public int Number { get; set; }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        if (Name == "CorrectName" && Number == 1) {
            RouteValueDictionary routeDictionary = new RouteValueDictionary { { "action", "SomeAction" }, { "controller", "NameController" } };
            context.Result = new RedirectToRouteResult(routeDictionary);
        }

        base.OnActionExecuted(context);
    }
}

1 Ответ

1 голос
/ 24 января 2020

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

Вместо этого вы можете получить доступ к экземпляру службы NameController, например:

public class NameController : Controller
{
    private readonly ServiceOne _serviceOne;

    public ServiceOne ServiceOne => _serviceOne;

    public NameController(ServiceOne serviceOne)
    {
        _serviceOne = serviceOne;
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public string Name { get; set; }
    public int Number { get; set; }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var controller = context.Controller as NameController;
        var service = controller.ServiceOne;
        //Use the service here
    }
}

См. Также Доступ к свойству контроллера из фильтра действий

...