private ActionSelectorCandidate SelectOverloadedCandidate(IEnumerable <ActionSelectorCandidate> candidates, QueryStringParameterCollection queryData) { foreach (var candidate in candidates) { var action = candidate.Action; var isMatch = true; var exactCount = 0; foreach (var actionParam in action.Parameters) { var nameProvider = actionParam.BindingInfo as IModelNameProvider; var name = nameProvider?.Name ?? actionParam.Name; if (queryData.ContainsKey(name)) { if (HasFromQueryAttribute(actionParam)) { if (queryData[name].Count() > 1 && !IsCollection(actionParam.ParameterType)) { isMatch = false; break; } exactCount++; } else { // parameter with the right name but without FromQueryAttribute isMatch = false; break; } } else { if (HasFromQueryAttribute(actionParam)) { // parameter was expected in the query string isMatch = false; break; } } } if (isMatch && exactCount == queryData.Count) { return(candidate); } } return(null); }
private ActionSelectorCandidate SelectExactCandidate(IEnumerable <ActionSelectorCandidate> candidates, QueryStringParameterCollection queryData) { foreach (var candidate in candidates) { var action = candidate.Action; var isMatch = true; foreach (var actionParam in action.Parameters) { var nameProvider = actionParam.BindingInfo as IModelNameProvider; var name = nameProvider?.Name ?? actionParam.Name; if (queryData.ContainsKey(name)) { isMatch = HasFromQueryAttribute(actionParam); if (!isMatch) { break; } if (queryData[name].Count() > 1 && !IsCollection(actionParam.ParameterType)) { isMatch = false; break; } } else { isMatch = false; break; } } if (isMatch) { return(candidate); } } return(null); }