protected readonly IRepo
protected readonly IAppLogging
protected BaseCrudController(IRepo
{
MainRepo = repo;
Logger = logger;
}
Методы GetXXX
Есть два HTTP-метода GET
, GetOne
и GetAll
. Оба они используют хранилище, переданное контроллеру. Первым делом добавьте метод Getll
, который служит в качестве конечной точки для шаблона маршрута контроллера:
///
/// Gets all records
///
///
///
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(400, "The request was invalid")]
[HttpGet]
public ActionResult
{
return Ok(MainRepo.GetAllIgnoreQueryFilters);
}
Следующий метод получает одиночную запись на основе параметра id
, который передается как обязательный параметр маршрута и добавляется к маршруту производного контроллера:
///
/// Gets a single record
///
/// Primary key of the record
///
///
///
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(204, "No content")]
[HttpGet("{id}")]
public ActionResult
{
var entity = MainRepo.Find(id);
if (entity == null)
{
return NotFound;
}
return Ok(entity);
}
Значение маршрута автоматически присваивается параметру id
(неявно из [FromRoute]
).
Метод UpdateOne
Обновление записи делается с применением HTTP-метода PUT
. Ниже приведен код метода UpdateOne
:
///
/// Updates a single record
///
///
/// Sample body:
///
/// {
/// "Id": 1,
/// "TimeStamp": "AAAAAAAAB+E="
/// "MakeId": 1,
/// "Color": "Black",
/// "PetName": "Zippy",
/// "MakeColor": "VW (Black)",
/// }
///
///
/// Primary key of the record to update
///
///
///
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(400, "The request was invalid")]
[HttpPut("{id}")]
public IActionResult UpdateOne(int id,T entity)
{
if (id != entity.Id)
{
return BadRequest;
}
try
{
MainRepo.Update(entity);
}
catch (CustomException ex)
{
// Пример специального исключения.
// Должно обрабатываться более элегантно.
return BadRequest(ex);
}
catch (Exception ex)
{
// Должно обрабатываться более элегантно.
return BadRequest(ex);
}
return Ok(entity);
}
Метод начинается с установки маршрута как запроса HttpPut
на основе маршрута производного контроллера с обязательным параметром маршрута id
. Значение маршрута присваивается параметру id
(неявно из [FromRoute]
), а сущность (entity
) извлекается из тела запроса (неявно из [FromBody]
).Также обратите внимание, что проверка достоверности модели отсутствует, поскольку делается автоматически атрибутом ApiController
. Если состояние модели укажет на наличие ошибок, тогда клиенту будет возвращен код 400 (Bad Request).