挥舞着显示不正确的查询参数

时间:2019-04-09 08:16:31

标签: c# asp.net-core swagger

我有这个控制器和操作方法:

[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使用者感到困惑:

swagger

我可以使用[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”?

2 个答案:

答案 0 :(得分:1)

将属性[FromRoute]添加到控制器参数:

    public Task<AvailableSlotsResponse> GetAvailableSlots([FromRoute]Request<AvailableSlotsRequest> request)

从“模型”属性中删除属性FromQuery,并从“位置属性”中取消注释属性FromQuery

enter image description here

答案 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]

相比,这也意味着该模型可以使用任何属性。