Маршрут к контроллеру на основе строки запроса - PullRequest
0 голосов
/ 04 декабря 2018

Проблема: мы обновляем устаревшую систему, поэтому решения ограничены.Я пытаюсь маршрутизировать на неавторизованный контроллер, если присутствует конкретная строка запроса.Если его нет, пользователь направляется к авторизованному контроллеру.Это на ASP.Net Core 2.1.

Можно ли настроить контроллер на маршрутизацию на основе строки запроса?Я пытался

[/ home / [action]? Query = {query}] -> Приводит к ошибке во время выполнения из-за '?'

[/ home / [action] / {query}] -> отображается в / home / index / 1 (не то, что мне нужно)

Спасибо за любую помощь!

Редактировать: В качестве альтернативы, возможно ли иметь отдельное действие контроллера, котороезависит от параметра запроса?

публичный индекс Iactionresult () {}

публичный индекс Iactionresult (запрос строки [FromQuery]) {}

Маршрутизация, похоже, не различаетмежду этими двумя.

1 Ответ

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

Для этого вы можете использовать IActionConstraint и IParameterModelConvention интерфейсы.Вкратце, создайте 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;
    }
}

Если в строке запроса запроса не найден соответствующий параметр, он вернет false из метода Accept.

Than create RequiredFromQueryAttribute класс, подобный следующему:

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("api/[controller]")]
public class ValuesController : Controller
{
    [HttpGet("{id}")]
    public string Get(int id, [RequiredFromQuery]string foo, [RequiredFromQuery]string bar)
    {
        return id + " " + foo + " " + bar;
    }
}

С этого момента только следующий URL GET api/values/5?foo=a&bar=b будетприведите к действию выше, все другие комбинации параметров приведет к ответу со статусом 404, который вы можете в конечном итоге заменить тем, что вы хотите.

Вы можете найти больше информации по этой ссылке https://www.strathweb.com/2016/09/required-query-string-parameters-in-asp-net-core-mvc/

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