我正在尝试使用角度应用程序中的$ 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,但是我想知道是否有任何正确的方法来实现这一点。
谢谢, 萨姆
答案 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 ...