我有这个控制器和操作方法:
[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”?
答案 0 :(得分:1)
将属性[FromRoute]
添加到控制器参数:
public Task<AvailableSlotsResponse> GetAvailableSlots([FromRoute]Request<AvailableSlotsRequest> request)
从“模型”属性中删除属性FromQuery
,并从“位置属性”中取消注释属性FromQuery
。
答案 1 :(得分:0)
不幸的是,我不得不使用[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]