private async Task BindFromUri(ModelMetadataProvider metadataProvider, HttpActionContext actionContext,
                                       CancellationToken cancellationToken)
        {
            var uriBinding = _descriptor.BindWithAttribute(new FromUriAttribute());
            await uriBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken);

            var bindedValue = GetValue(actionContext) as IClientQuery;
            var query       = GetValue(actionContext) as IClientQuery ??
                              Activator.CreateInstance(_descriptor.ParameterType) as IClientQuery;

            if (bindedValue == null)
            {
                SetValue(actionContext, query);
            }
            var clientFilterable = query as IClientFilterable;
            var clientSortable   = query as IClientSortable;
            var clientPageable   = query as IClientPageable;
            var queryString      = actionContext.Request.GetQueryNameValuePairs()
                                   .Where(x => Keys.KnownKeys.Contains(x.Key))
                                   .ToDictionary(x => x.Key, x => (object)x.Value);
            var routeDataValues = actionContext.Request.GetRouteData()
                                  .Values
                                  .Where(x => Keys.KnownKeys.Contains(x.Key));
            var requestValues = queryString.Union(routeDataValues).ToDictionary(x => x.Key, x => x.Value);

            if (queryString.ContainsKey(Keys.Filter) && clientFilterable != null)
            {
                var converter = new QueryStringFilterConverter();
                var filter    = (IFilter)converter.ConvertFrom(queryString[Keys.Filter]);
                clientFilterable.ClientFilter = filter ?? new AlwaysTrueFilter();
            }
            if (queryString.ContainsKey(Keys.Sort) && clientSortable != null)
            {
                var converter = new SortTypeConverter();
                var sort      = (ISort)converter.ConvertFrom(queryString[Keys.Sort]);
                clientSortable.ClientSort = sort ?? clientSortable.ClientSort ?? new RandomSort();
            }
            if ((queryString.ContainsKey(Keys.PageNumber) || queryString.ContainsKey(Keys.PageSize)) && clientPageable != null)
            {
                int pageNumber = 1, pageSize = 10;
                var hasNumber = requestValues.ContainsKey(Keys.PageNumber) && int.TryParse(requestValues[Keys.PageNumber].ToString(), out pageNumber);
                var hasSize   = requestValues.ContainsKey(Keys.PageSize) && int.TryParse(requestValues[Keys.PageSize].ToString(), out pageSize);
                var page      = new ClientPage
                {
                    PageNumber = hasNumber ? (int?)pageNumber : null,
                    PageSize   = hasSize ? (int?)pageSize : null
                };
                clientPageable.ClientPage = page;
            }
        }
Exemple #2
0
        public void Can_Deserialize_And_Execute_Sort_From_Query_String()
        {
            const string text      = "year DESC, make ASC";
            var          converter = new SortTypeConverter();
            var          sort      = (ISort)converter.ConvertFrom(text);

            Assert.IsNotNull(sort);
            Assert.IsInstanceOfType(sort, typeof(DynamicLinqSort));

            var expected = Cars.OrderByDescending(x => x.Year).ThenBy(x => x.Make).ToList();
            var actual   = sort.ToDelegate <Car>()(Cars.AsQueryable()).ToList();

            Assert.IsTrue(expected.SequenceEqual(actual));
        }