【问题标题】:How to properly send action parameter along with query in BreezeJs如何在 BreezeJs 中正确发送操作参数和查询
【发布时间】:2012-12-04 13:52:10
【问题描述】:

目前我正在调用 BreezeJs 文档/示例中显示的所有数据查询:

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 查询字符串,例如:

?$filter=IsArchived%20eq%20false&$orderby=CreatedAt

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

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?请帮忙。

【问题讨论】:

    标签: breeze


    【解决方案1】:

    从 v 0.76.1 开始,您可以使用 EntityQuery.withParameters 方法将附加参数传递给任何服务方法。因此,您现在可以构造一个如下所示的查询,该查询既传递参数又使用微风的 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 文档有更多信息。

    【讨论】:

      【解决方案2】:

      更新:从 BREEZE v.0.76.1 开始,这不再是正确的答案。 BREEZE 现在支持查询参数。请参阅“withParameters”查询子句。

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

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

      【讨论】:

      • 很高兴在breezejs.com 有一个地方,您可以在这里发布有关即将推出的简短信息。
      • 这对我来说不是最重要的事情,所以我可以等待。
      • 这不再是正确的答案。正如我所希望的那样,“withParameters”功能已在 v.0.76.1 中添加到 Breeze 中,并在 Jay 的回答中进行了描述。我赞成他的。正如所承诺的,我正在将引用的网页删除到 hack。请使用“withParameters”
      猜你喜欢
      • 2018-08-31
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2020-10-10
      相关资源
      最近更新 更多