Связывание базовой модели ASP.NET из маршрута и строки запроса - PullRequest
0 голосов
/ 17 января 2019

Я хотел бы выполнить запрос GET, например https://localhost:12345/api/employees/1/calendar/2018/2019?checkHistoricalFlag=true

Я создал этот метод в моем контроллере, который работает как ожидалось:

[AllowAnonymous]
[HttpGet("/api/employees/{clockNumber:int}/calendar/{yearFrom:int}/{yearTo:int}")]
public IActionResult Get(int clockNumber, int yearFrom, int yearTo, bool checkHistoricalFlag = false)
{
  return Ok();
}

Однако я бы предпочел использовать следующую модель представления:

public class DetailsQuery
{
  [Required]
  public int? ClockNumber { get; set; }
  [Required]
  public int? YearFrom { get; set; }
  [Required]
  public int? YearTo { get; set; }
  public bool CheckHistoricalFlag { get; set; } = false;
}

Это связывает параметры маршрута, но игнорирует "checkHistoricalFlag" из строки запроса:

[AllowAnonymous]
[HttpGet("/api/employees/{clockNumber:int}/calendar/{yearFrom:int}/{yearTo:int}")]
public IActionResult Get([FromRoute]DetailsQuery query)
{
  return Ok();
}

Удаление [FromRoute] приводит к ошибке 415 «Неподдерживаемый тип носителя».

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

[AllowAnonymous]
[HttpGet("/api/employees/{clockNumber:int}/calendar/{yearFrom:int}/{yearTo:int}")]
public IActionResult Get([FromRoute]DetailsQuery query, bool checkHistoricalFlag = false)
{
  return Ok();
}

1 Ответ

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

Комментарий от Imantas указал мне на использование [FromQuery] для модели представления, которая теперь выглядит следующим образом:

public class DetailsQuery
{
  [Required]
  public int? ClockNumber { get; set; }
  [Required]
  public int? YearFrom { get; set; }
  [Required]
  public int? YearTo { get; set; }
  [FromQuery]
  public bool CheckHistoricalFlag { get; set; } = false;
}

Метод контроллера теперь:

[AllowAnonymous]
[HttpGet("/api/employees/{clockNumber:int}/calendar/{yearFrom:int}/{yearTo:int}")]
public ActionResult Get([FromRoute]DetailsQuery query)
{
  return Ok();
}

Который работает как положено.

Спасибо за указатель Imantas.

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