Always place more specific route before less specific in your routes definitions ....
And I always forget it.
More specific route includes your parameters and so :
routes.MapRoute("ReportsWithoutMISCode",
"Reports/{Action}/{programObjectiveId}/{userName}",
new { controller = "Reports", action = "Index" },
new { programObjectiveId = @"\d+" },
new[] { "Web.Controllers.Reports" });
routes.MapRoute("ReportsWithMISCode",
"Reports/{Action}/{programObjectiveId}/{userName}/{MISCode}",
new { controller = "Reports", action = "Index" },
new { programObjectiveId = @"\d+" },
new[] { "Web.Controllers.Reports" });
; should be switched since second route ReportsWithMISCode is more specific, means having more parameters.
So it should be:
routes.MapRoute("ReportsWithMISCode",
"Reports/{Action}/{programObjectiveId}/{userName}/{MISCode}",
new { controller = "Reports", action = "Index" },
new { programObjectiveId = @"\d+" },
new[] { "Web.Controllers.Reports" });
routes.MapRoute("ReportsWithoutMISCode",
"Reports/{Action}/{programObjectiveId}/{userName}",
new { controller = "Reports", action = "Index" },
new { programObjectiveId = @"\d+" },
new[] { "Web.Controllers.Reports" });
It is interesting to note that in first case route works in awkward way. It gets matched but third parameter MISCode is appended as query param with question mark like this:
...ReportXXX/101/pt2?MISCode=MyMISCode
After switching to second solution we get friendly url.