除非参数作为 int 发送,否则 OData 找不到控制器

OData cannot find the controller unless the parameter is sent as int

我有这个 OData 控制器,它适用于 GET 和 Patch 方法。但是,我必须创建一个自定义 GET 方法,以便用于从不同的服务器加载数据并复制到 OData 从中检索数据的新服务器。当用户 "Retrieves" 新数据时,它将日期作为参数发送。由于这是一个新的日期声明,我无法将日期放入 $filter,因此使用了新的 GET 方法。

这是 GET 方法的样子:

        [ODataRoute("Claims({key})")]
        [HttpGet]
        [EnableQuery(AllowedQueryOptions= System.Web.OData.Query.AllowedQueryOptions.All)]
        public HttpResponseMessage ClaimByDate([FromODataUri] int key)
        {
            System.Diagnostics.Debug.WriteLine(key);
            string date = key.ToString();
            DateTime claimDate = DateTime.ParseExact(date, "ddMMyyyy", CultureInfo.InvariantCulture);
            DateTime today = DateTime.Today;

            if (!ClaimsExistForToday(today))
            {
                GenerateClaimsList(today, claimDate);
                return Request.CreateResponse(HttpStatusCode.OK);
            }

            return Request.CreateResponse(HttpStatusCode.NotModified);

        }

这是 angularjs 控制器

vm.retrieve = function () {

    if (vm.selectedDate !== null) {
        var day = vm.selectedDate.getDate();
        var date = (day + "" + (vm.selectedDate.getMonth() + 1) + "" + (vm.selectedDate.getFullYear()));

        ClaimService.getClaimsByDate(date)
            .then(function (response) { if (response) activate(); })

        vm.clear();
    }
}

这是发送 get 请求的 angular 函数:

function getClaimsByDate(date) { //Angularjs service

    return $http.get("odata/Claims(" + date + ")")
        .then(function (data) {

            return true;
        });
}

第一期: OData GET 方法的参数必须为 "int"。我尝试使用字符串和 DateTime,但是当我使用 'string' 作为参数发送数据时,它根本找不到控制器,除非数据以整数形式发送。如果我将日期作为 UTC 发送,我会收到 potentially dangerous 错误并且不会执行。

第二期: 以 int 形式发送日期,如果日期以 ddMMyyyy 格式发送为 30112015,它将找到控制器,但不会找到 111201501112015。似乎它只能识别大于 10 的日期。除此之外,其他一切正常,包括使用 [EnableQuery] 的常规 GET 方法。

我找到了这个 SO 答案 ,它帮助了我。我最终创建了一个以 key 作为参数的函数。然后只需要从 Angular 调用函数即可。