Похоже, что хороший кандидат для связки пользовательских моделей:
public class FilterViewModel
{
public string Key { get; set; }
public string Value { get; set; }
}
public class FilterViewModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var filterParamRegex = new Regex(bindingContext.ModelName + @"\((?<key>.+)\)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
return
(from key in controllerContext.HttpContext.Request.Params.AllKeys
let match = filterParamRegex.Match(key)
where match.Success
select new FilterViewModel
{
Key = match.Groups["key"].Value,
Value = controllerContext.HttpContext.Request[key]
}).ToArray();
}
}
, который будет зарегистрирован в Application_Start
:
ModelBinders.Binders.Add(typeof(FilterViewModel[]), new FilterViewModelBinder());
и затем:
public ActionResult GetData(FilterViewModel[] filter, int page, int pageSize)
{
...
}
Преимущество пользовательского связывателя модели заключается в том, что он делает именно то, что предлагает его имя: связывание пользовательской модели, поскольку параметры строки запроса не соответствуют стандартным соглашениям, используемым связывателем модели по умолчанию. В дополнение к этому ваше действие контроллера чисто и просто, и ему не нужно полагаться на какой-то уродливый код, который, очевидно, не является обязанностью действий контроллера.