如何在BreezeJs中正确发送动作参数和查询

时间:2012-12-04 13:52:10

标签: breeze

目前我正在调用所有数据查询,如BreezeJs docs / examples:

所示
getEntityList = function (predicate) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  return manager.executeQuery(query);
}

但是我希望在返回任何可查询结果之前将其他参数传递给控制器​​操作:

[AcceptVerbs("GET")]
public IQueryable<Entity> EntityList(string actionParam) {
  //here goes logic that depends on actionParam
  //and returns IQueryable<Entity>
}

正如我们从文档中所知:

  

Breeze将查询转换为OData查询字符串,例如:

     
    ?

$滤波器=的isArchived%20当量%20false&安培; $的OrderBy = CreatedAt

  

这是问题的开始。我应该如何构建查询以将param传递给控制器​​操作?

getEntityList = function (predicate, actionParam) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  if(actionParam)
    // ???
  return manager.executeQuery(query);
}

我已经尝试将路线设置为:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{actionParam}",
            defaults: new { query = RouteParameter.Optional }
        );

并通过 from 部分发送 actionParam

var query = new entityModel.EntityQuery()
  .from("EntityList/" + encodeURIComponent(actionParam));

但是在一些特殊的字符上编码失败并且抛出了错误的请求。

如何在这种情况下正确发送 actionParam ?请帮忙。

2 个答案:

答案 0 :(得分:24)

从v 0.76.1开始,您可以使用EntityQuery。 withParameters 方法将其他参数传递给任何服务方法。因此,您现在可以构建如下所示的查询,它们都传递参数并使用breeze的IQueryable支持。

EntityQuery.from("EmployeesFilteredByCountryAndBirthdate")
                 .withParameters({ BirthDate: "1/1/1960", Country: "USA" })
                 .where("LastName", "startsWith", "S")
                 .orderBy("BirthDate");

你的控制器方法看起来像这样:

[HttpGet]
public IQueryable<Employee> EmployeesFilteredByCountryAndBirthdate(DateTime birthDate, string country) {
      return ContextProvider.Context.Employees.Where(emp => emp.BirthDate >= birthDate && emp.Country == country);
}

API文档包含更多信息。

答案 1 :(得分:6)

更新:作为BREEZE v.0.76.1,这不再是正确的答案。 BREEZE现在支持QUERIES的参数。查看“ withParameters ”QUERY CLAUSE。

Breeze已经添加了对参数化查询的支持,部分归功于SO上的这个问题。谢谢。

此答案用于描述不再需要的解决方法。我修改了我的答案,取消了对该解决方法的描述。