【发布时间】:2019-08-30 11:13:10
【问题描述】:
我有这个控制器和动作方法:
[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] 属性中复制“位置”一词?
【问题讨论】:
-
不是专注于回答这个问题,但我不能避免问:你真的需要将两个字符串参数包装到一个泛型类中吗?这似乎只是增加了噪音和复杂性。当然,除非你有充分的理由这样做。
-
@jpgrassi 这实际上是一个更复杂的模型,但为了简单起见,我只留下了 Location 字符串。
标签: c# asp.net-core swagger