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); }
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); }