Добавление ограничения с помощью HttpGet (...) не работает в ASP.Net Core - PullRequest
0 голосов
/ 20 января 2019

Я новичок в основной платформе ASP.NET. Я работаю над примером приложения, где я собираю некоторые ежедневные данные из сервиса. Моя подпись API, как показано ниже -

[HttpGet("daily/{state}/{year}/{month}/{day}")]
public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day)
{
    //...
}

Мое требование - ограничить параметр state 3 символами и всеми прописными буквами.

Итак, я сделал это -

[HttpGet("daily/{state:regex(A-Z):maxlength(3)}/{year}/{month}/{day}")]
public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day)
{
    //...
}

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

Работает нормально, если я не накладываю ограничений.

Обновлено - см. Следующий снимок экрана с VS2017. Я передаю URL как http://localhost:51208/api/daily/mah/2018/08/13, и все же IsValid ModelState возвращает true. Почему?

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Более понятным способом является создание модели для вашего запроса на получение.

  public class DailyModel
    {
        [Required]
        [RegularExpression("^[A-Z]{3}$", ErrorMessage ="State should be length of 3 and all in Upper Case")]
        public string State { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public int Day { get; set; }
    }

И применение аннотации данных к вашим полям, как в приведенном выше коде.А на вашем контроллере вы можете отправить недопустимое сообщение о состоянии модели, если запрос недействителен.

  [Route("api/[controller]")]
    public class TestController : Controller
    {

        [HttpGet("daily/{state}/{year}/{month}/{day}")]
        public async Task<IActionResult> Daily([FromRoute] DailyModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

          ...
        }
    }
0 голосов
/ 20 января 2019

Не найден, потому что вызываемый URL, скорее всего, не соответствует ограничению регулярного выражения.

Рассмотрите возможность проверки вашего регулярного выражения.

Простой пример

^[A-Z]{1,3}$

Соответствует одному символу в диапазоне: [A-Z] от 1 до 3 раз.

Это означает, что оно будет соответствовать от A до ZZZ

Если длина должна быть ровно 3 символа, удалите диапазон

^[A-Z]{3}$

Что будет соответствовать AAA до ZZZ

Поэтому обновите ограничение соответствующим образом.

[HttpGet("daily/{state:regex(^[[A-Z]]{{3}}$)}/{year:int}/{month:int}/{day:int}")]

Обратите внимание, что токены регулярного выражения должны быть экранированы. Например, символы \, {, }, [, ] необходимо экранировать, удваивая их, чтобы экранировать символы-разделители параметра Routing.

Ссылка Маршрутизация в ASP.NET Core: регулярные выражения о экранировании регулярного выражения.

Для желаемого совпадения

GET {host}/daily/ABC/2019/01/20
...