Подтвердить что ты не робот

Как правильно отправить параметр действия вместе с запросом в BreezeJs

В настоящее время я вызываю все запросы данных, как показано в документах/примерах 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, такую ​​как этот:

?

$= фильтр 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 }
        );

и отправив actionParam, применив его в разделе from,

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

но кодирование не выполняется с некоторыми специальными символами, и возникает ошибка запроса.

Как правильно отправить actionParam в такой сценарий? Пожалуйста, помогите.

4b9b3361

Ответ 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

ОБНОВЛЕНИЕ: КАК БРИЗ v.0.76.1 ЭТО НЕ БОЛЬШЕ ИСПРАВЛЕННЫЙ ОТВЕТ. BREEZE NOW ПОДДЕРЖИВАЕТ ПАРАМЕТРЫ ПО ВОПРОСАМ. ВИДИТЕ " с параметрами" QUERY CLAUSE.

Поддержка параметризованных запросов была добавлена ​​в Breeze, частично благодаря этому вопросу о SO. Спасибо.

Этот ответ используется для описания обходного пути, который больше не нужен. Я пересмотрел свой ответ, исключив описание этого обходного пути.