public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }

            if (bindingContext.ModelType != typeof(FilterModel))
            {
                return(Task.CompletedTask);
            }

            var parameters = new Dictionary <string, string>();

            foreach (var parameter in bindingContext.ModelType.GetProperties())
            {
                var valueProviderResult = bindingContext.ValueProvider.GetValue(parameter.Name);
                if (valueProviderResult.FirstValue != null)
                {
                    parameters.Add(parameter.Name, valueProviderResult.FirstValue);
                }
            }

            var result = new FilterModel();

            PropertyInfo[] properties = result.GetType().GetProperties();
            foreach (var property in properties)
            {
                if (!parameters.Any(p => p.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase)))
                {
                    continue;
                }

                KeyValuePair <string, string> parameter = parameters.First(p => p.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase));

                Type propertyType = result.GetType().GetProperty(property.Name).PropertyType;
                Type newType      = Nullable.GetUnderlyingType(propertyType) ?? propertyType;

                object newObject = Convert.ChangeType(parameter.Value, newType);
                result.GetType().GetProperty(property.Name).SetValue(result, newObject, null);
            }

            bindingContext.Result = ModelBindingResult.Success(result);
            return(Task.CompletedTask);
        }
示例#2
0
        protected virtual string ApplyFilterToRequest(string resourceUrl, FilterModel filter)
        {
            if (filter == null)
            {
                return(resourceUrl);
            }

            var filters = new Dictionary <string, string>(filter.Filters);
            var type    = filter.GetType();
            var props   = type.GetProperties();

            foreach (var p in props)
            {
                if (p.Name == nameof(filter.Filters) || p.Name == nameof(filter.IfModifiedSince))
                {
                    continue;
                }

                var val = p.GetValue(filter);
                if (val == null)
                {
                    continue;
                }

                var sVal = string.Empty;
                if (val.GetType() == typeof(DateTime))
                {
                    sVal = ((DateTime?)val).Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
                }
                else if (val.GetType() == typeof(string[]))
                {
                    sVal = string.Join(",", (string[])val);
                }
                else
                {
                    sVal = val.ToString();
                }
                filters.Add(p.Name, sVal);
            }

            var res = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(resourceUrl, filters);

            return(res);
        }