I think you should use ModelBinder. Something like this
public class SearchOptionsDataBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(SearchOptions))
{
var baseResult = (SearchOptions)base.BindModel(controllerContext, bindingContext);
var request = controllerContext.HttpContext.Request;
baseResult.Contracts = request.QueryString
.GetValues("contracts")
.Select(GetContractTypeByCode)
.Where(c => !string.IsNullOrEmpty(c.Code))
.ToArray();
return baseResult;
}
return base.BindModel(controllerContext, bindingContext);
}
}
And then add custom model binder to Application_Start:
ModelBinders.Binders.Add(typeof(SearchOptions), new SearchOptionsDataBinder());