У меня есть этот контроллер и метод действия:
[ApiController]
[Route("api/[controller]")]
public class AppointmentController : ControllerBase
{
[Route("{provider}/AvailableSlots")]
[HttpGet]
public Task<AvailableSlotsResponse> GetAvailableSlots(Request<AvailableSlotsRequest> request)
{
return null;
}
}
Вот модель:
public class Request<T> where T : class
{
[FromRoute]
public string Provider { get; set; }
[FromQuery(Name = "")]
public T Model { get; set; }
}
public class AvailableSlotsRequest
{
//[FromQuery(Name = "Location")] //Would prefer not to have to use this
public string Location { get; set; }
}
Мне нужно использовать Location
в качестве имени параметра запроса в URL-адресе, чтобы, как и ожидалось, попасть в конечную точку.
например. http://localhost/api/Appointment/Company/AvailableSlots?Location=SYD
Однако, когда я просматриваю страницу Swagger, параметр называется Model.Location
, что сбивает с толку пользователей моего API:
Я могу использовать [FromQuery(Name = "Location")]
, чтобы заставить Swagger отображать Location
, однако это кажется очень избыточным и дублирует имя свойства.
Вот мой Swagger, настроенный в ConfigureServices()
:
services.AddSwaggerDocument(document =>
{
document.PostProcess = d =>
{
d.Info.Version = Configuration["APIVersion"];
d.Info.Title = $"{Configuration["ApplicationName"]} {Configuration["DomainName"]} API";
};
});
Как я могу заставить Swagger отображать Location
вместо Model.Location
, не дублируя слово «Местоположение» в атрибуте [FromQuery]
?
@jpgrassi На самом деле это более сложная модель, но для простоты вопроса я просто оставил строку «Местоположение».
Добавьте к параметру контроллера атрибут [FromRoute]
:
public Task<AvailableSlotsResponse> GetAvailableSlots([FromRoute]Request<AvailableSlotsRequest> request)
Удалите атрибут FromQuery
в свойстве Model и раскомментируйте атрибут FromQuery
в свойстве Location.
Возможно, я недостаточно ясно изложил вопрос (я только что обновил его). Я бы предпочел не использовать [FromQuery(Name = "Location")], так как это именно то, что называется свойством.
К сожалению, мне пришлось использовать [FromQuery(Name = "<PropertyName>")]
.
Однако я нашел лучший способ:
[ApiController]
[Route("api/[controller]")]
public class AppointmentController : ControllerBase
{
[Route("{provider}/AvailableSlots")]
[HttpGet]
public Task<AvailableSlotsResponse> GetAvailableSlots(AvailableSlotsRequest request)
{
return null;
}
}
public class Request
{
[FromRoute]
public string ProviderName { get; set; }
}
public class AvailableSlotsRequest : Request
{
[FromQuery]
public string Location { get; set; }
}
Это также означает, что модель может использовать любой атрибут, по сравнению с моей первой попыткой, когда T Model
был украшен [FromQuery]
.
Не то чтобы я сосредоточился на ответе на вопрос, но я не могу не спросить: вам действительно нужно обернуть два строковых параметра в общий класс? Кажется, это просто добавляет шума и сложности. Если, конечно, у вас нет для этого веских причин.