using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Primitives; using Umbraco.Core; using Umbraco.Extensions; namespace Umbraco.Web.Common.ModelBinders { /// /// Allows an Action to execute with an arbitrary number of QueryStrings /// /// /// Just like you can POST an arbitrary number of parameters to an Action, you can't GET an arbitrary number /// but this will allow you to do it. /// public sealed class HttpQueryStringModelBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { var queryStrings = GetQueryAsDictionary(bindingContext.ActionContext.HttpContext.Request.Query); var queryStringKeys = queryStrings.Select(kvp => kvp.Key).ToArray(); if (queryStringKeys.InvariantContains("culture") == false) { queryStrings.Add("culture", new StringValues(bindingContext.ActionContext.HttpContext.Request.ClientCulture())); } var formData = new FormCollection(queryStrings); bindingContext.Result = ModelBindingResult.Success(formData); return Task.CompletedTask; } private Dictionary GetQueryAsDictionary(IQueryCollection query) { var result = new Dictionary(); if (query == null) { return result; } foreach (var item in query) { result.Add(item.Key, item.Value); } return result; } } }