我有这个控制器和动作方法:
[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
,但这感觉非常多余并重复属性名称。
这是我在ConfigureServices()
设置的Swagger:
services.AddSwaggerDocument(document =>
{
document.PostProcess = d =>
{
d.Info.Version = Configuration["APIVersion"];
d.Info.Title = $"{Configuration["ApplicationName"]} {Configuration["DomainName"]} API";
};
});
我怎样才能使Swagger显示Location
而不是Model.Location
,而不必在[FromQuery]
属性中复制“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]
装饰