带有null参数的$ http.get未访问Web API控制器

时间:2015-12-17 13:07:23

标签: angularjs asp.net-web-api2 angular-http

我正在尝试使用角度应用程序中的$ http.get来访问Web API GET控制器,如下所示:

$http.get(BasePath + '/api/documentapi/GetDocuments/' , 
                                {
                                    params: {
                                        PrimaryID: ID1,
                                        AlternateID: ID2,                                            
                                    }
                                }).then( ...

在我的情况下,PrimaryID或AlternateID将具有该值。因此,其中一个将始终为null。

我的Web api方法

public DocumentsDto[] GetDocuments(decimal? PrimaryID, decimal? AlternateID)
    { ...

当其中一个值为null时,$ http.get生成的url如下:

http://BaseServerPath/api/documentapi/GetDocuments/?PrimaryID=1688 

 http://BaseServerPath/api/documentapi/GetDocuments/?AlternateID=154

这不符合我的Web API方法。

但是,如果我使用

http://BaseServerPath/api/documentapi/GetDocuments/?PrimaryID=1688&AlternateID=null

它有效。我可以在我的参数中将值硬编码为null,但是我想知道是否有任何正确的方法来实现这一点。

谢谢, 萨姆

4 个答案:

答案 0 :(得分:9)

我从@RobJ得到了正确答案。他发布了答案的链接。我也在这里粘贴相同的答案。解决方案是具有Web API参数的默认值。

public DocumentsDto[] GetDocuments(decimal? PrimaryID = null, decimal? AlternateID = null)
{ ...

就我而言,它将是

{{1}}

答案 1 :(得分:1)

虽然您已在Web API控制器上指定这两个参数可以为null,但ASP.NET路由引擎仍会在调用该方法时查找两个参数 - 即使其中一个参数为null

理想情况下,您可以创建两个方法,一个只接受主要,一个只接受辅助,但在您的情况下,由于您的ID属于同一类型,因此这有点棘手。虽然您可以指定哪个参数对应于查询字符串中提供的值,但这两个方法在控制器类中都具有相同的签名(类型为decimal的单个参数)。

所以你有两个选择。创建新的控制器,以便有一个接收PrimaryID的查询和SecondaryID的查询,或者你有一个方法将一个包含一个ID的对象设置为一个值而另一个为null,并根据它运行您的查询。

答案 2 :(得分:0)

另一个选项可以是将请求参数转换为复杂对象,并使用[FromUri]从Url创建对象。

答案 3 :(得分:0)

你可以试试这个:

$http.get(BasePath + '/api/documentapi/GetDocuments/' , 
                            {
                                params: {
                                    PrimaryID: ID1!=undefined?ID1:0,
                                    AlternateID: ID2!=undefined?ID2:0,                                            
                                }
                            }).then( ...

然后你可以在webapi中处理0 ...