【问题标题】:$http.get with null parameters are not hitting the Web API controller带有空参数的 $http.get 没有命中 Web API 控制器
【发布时间】:2015-12-17 13:07:23
【问题描述】:

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

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

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

我的 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,但是我想知道是否有任何正确的方法可以实现这一点。

谢谢, 山姆

【问题讨论】:

  • 请在后端分享web api代码。
  • 这与 WebApi 的关系比与 Angular 的关系更大,请参阅post
  • 您的参数可以为空。所以你可以传递空值。但是无论如何您都需要在url中传递参数名称
  • @RobJ 谢谢你的帖子。这解决了问题。是的,现在我看到它与 WebApi 一起使用。我将在这里发布相同的解决方案以及答案。

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


【解决方案1】:

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

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

在我的情况下是

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

【讨论】:

    【解决方案2】:

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

    理想情况下,您将创建两种方法,一种仅采用主要方法,一种仅采用次要方法,但在您的情况下,这有点棘手,因为您的两个 ID 属于同一类型。尽管您可以指定与查询字符串中提供的值对应的参数,但这两种方法在您的控制器类中将具有相同的签名(decimal 类型的单个参数)。

    所以你有两个选择。要么创建一个新的控制器,让你有一个接收PrimaryID 的查询和一个接收SecondaryID 的查询,或者你有一个方法将包含一个ID 设置为一个值而另一个为空的对象,并运行您的查询以此为基础。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以试试这个:

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

        那么你可以在webapi中处理0...

        【讨论】:

        • 这种方法是我在问题的最后部分提到的硬编码。我想将值分配为 null 本身。将 ID 设置为 0 意味着 ID 的值为 0。它也可以是肯定的情况,尽管通常我们不会将 ID 设置为 0。将其设置为 null 是一种更好的方法。无论如何,我已经发布了正确的答案。
        猜你喜欢
        • 2021-05-12
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 2013-05-09
        相关资源
        最近更新 更多