.NET Core Web API路由和GET请求

时间:2018-11-09 17:41:18

标签: javascript c# angular .net-core asp.net-core-webapi

我具有以下控制器(.NET Core Web API应用程序) (Source包含多个Site

SitesController.cs

// GET: api/sites
[HttpGet]
public IDictionary<int, Site> GetSites() {
    return _db.Sites.ToDictionary(s => s.SiteId, s => s);
}

// GET: api/sites?source=5
[HttpGet("{source}")]
public IDictionary<int, Site> GetSites([FromRoute] int source) {
    return _db.Sites.Where(s => s.SourceId == source).ToDictionary(s => s.SiteId, s => s);
}

// GET: api/sites/5
[HttpGet("{id}")]
public async Task<IActionResult> GetSite([FromRoute] int id) {

Angular 客户端仅从Site询问Source时,我获得了所有站点,没有调用带有int source参数的函数...为什么?

findAllSourceSites(sourceId: number): Observable<Site[]> {
    return this.http.get(`${this.API_URL}/api/sites`, {
        params: new HttpParams()
            .set('source', sourceId.toString())
    }).pipe(
        map(res => {
            return Object.values(res);
        })
    );
}

enter image description here

1 个答案:

答案 0 :(得分:4)

可以肯定的是,由于[FromRoute]的原因,您的URL应该为/api/sites/1HttpParams设置了查询字符串,现在您的URL看起来像/api/sites?source=1

如果要使用查询字符串,应将控制器更改为[FromQuery]

编辑: 由于AmbiguousActionException: Multiple actions matched.,替代解决方案会将两者结合在一起。

[HttpGet] 
public IDictionary<int, Site> GetSites([FromQuery] int? source) {
    if (source.HasValue) {
        // get specific 
    } else {
        // get all
    }
}