Атрибут для выбора маршрута / действия в зависимости от наличия параметра - PullRequest
0 голосов
/ 08 июля 2019

Я думал, но я не уверен, что существуют встроенные Атрибуты, которыми мы могли бы украшать наши Действия, которые бы выбирали / пропускали Действия, основываясь на наличии Переменной Связи Параметра или Модели.

Я думал что-то вроде этого:

/*   [Route("/Objectives"), MandatoryParam("CourseId")]
  Or [Route("/Objectives", Required("CourseId")]
  or something similar like below etc. */
[Route("/Objectives")]
[MandatoryParam("CourseId")]
public Action List<Objectives> FilteredByCourse(int courseId){
    ...
}

[Route("/Objectives")]
[MandatoryParam("CategoryId")]
public Action List<Objectives> FilteredByCategory(int categoryId){
    ...
}

Желаемый результат заключается в том, что /Objectives?courseId=5 и /Objectives?categoryId=15 будут направляться к двум различным действиям.

Кажется, я не могу найтиправильные поисковые термины, которые можно использовать для этого - они заканчиваются статьями, в которых говорится о связывании моделей или базовой маршрутизации, но ничего конкретного для этого сценария.Разве этого не существует?

1 Ответ

0 голосов
/ 08 июля 2019

Вы можете сделать это через IActionConstraint точку расширения.Создайте пользовательский IActionConstraint:

public class RequiredFromQueryActionConstraint : IActionConstraint
{
    private readonly string _parameter;

    public RequiredFromQueryActionConstraint(string parameter)
    {
        _parameter = parameter;
    }

    public int Order => 999;

    public bool Accept(ActionConstraintContext context)
    {
        if (!context.RouteContext.HttpContext.Request.Query.ContainsKey(_parameter))
        {
            return false;
        }

        return true;
    }
}

Соедините его с помощью IParameterModelConvention:

public class RequiredFromQueryAttribute : FromQueryAttribute, IParameterModelConvention
{
    public void Apply(ParameterModel parameter)
    {
        if (parameter.Action.Selectors != null && parameter.Action.Selectors.Any())
        {
            parameter.Action.Selectors.Last().ActionConstraints.Add(new RequiredFromQueryActionConstraint(parameter.BindingInfo?.BinderModelName ?? parameter.ParameterName));
        }
    }
}

Затем примените к вашему маршруту:

[Route("/Objectives")]
public IActionResult Action1([RequiredFromQueryAttribute] int courseId)
{
    return View();
}
[Route("/Objectives")]
public IActionResult Action2([RequiredFromQueryAttribute]int categoryId)
{
    return View();
}

Исходный код& article от здесь .

Результат: http://localhost:xxxx/Objectives?courseId=1 будет перенаправлен на Action1; http://localhost:xxxx/Objectives?categoryId=1 будет перенаправлен на Action2; http://localhost:xxxx/Objectives получит ошибку 404.

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