除非参数作为 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
,它将找到控制器,但不会找到 1112015
或 01112015
。似乎它只能识别大于 10 的日期。除此之外,其他一切正常,包括使用 [EnableQuery]
的常规 GET 方法。
我找到了这个 SO 答案 ,它帮助了我。我最终创建了一个以 key
作为参数的函数。然后只需要从 Angular 调用函数即可。
我有这个 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
,它将找到控制器,但不会找到 1112015
或 01112015
。似乎它只能识别大于 10 的日期。除此之外,其他一切正常,包括使用 [EnableQuery]
的常规 GET 方法。
我找到了这个 SO 答案 ,它帮助了我。我最终创建了一个以 key
作为参数的函数。然后只需要从 Angular 调用函数即可。