public class Search { public string Name {get;set;} public string Query {get;set;} } public ActionResult Results(Search query) { .... } .... ///results/{Name} .... ///results/monkeys?Query=12-of-them-jumping
The default model binder rather than binding to the object is trying to take your "Query" and plug it into the action method as an argument. Since string is not "Search" it results in a null value, the short lesson to take from this puzzle is to avoid naming properties on your object the same name as arguments you are passing into the controller action.