Это грубая идея вашего определения маршрутизации. Я вижу, что у вас есть три типа маршрутов:
routes.MapRoute(
"IrrelevantDates",
"{controller}/{application}/{type}/{range}",
// defaults
new {
controller = "Apps",
action = "UnboundReport",
type = "all",
range = "no-limit"
},
// constraints
new {
type = "apps|error"
}
);
routes.MapRoute(
"RelevantYearOnly",
"{controller}/{application}/{year}/{type}/{range}",
// defaults
new {
controller = "Apps",
action = "YearlyReport",
type = "all",
range = "no-limit"
},
// constraints
new {
year = "19\d{2}|2[01]\d{2}",
type = "apps|error"
}
);
routes.MapRoute(
"RelevantYearAndMonth",
"{controller}/{application}/{year}/{month}/{type}/{range}",
// defaults
new {
controller = "Apps",
action = "MonthlyReport",
type = "all",
range = "no-limit"
},
// constraints
new {
year = "19\d{2}|2[01]\d{2}",
month = "0[1-9]|1[0-2]",
type = "apps|error"
}
);
Я установил ограничение по году, чтобы оно совпадало с годами между 1900
и 2199
и месяцами, поэтому им фактически необходимо указать действительный месяц 01
до 12
.
Если у вас есть какие-либо дополнительные контроллеры, вам нужно будет также определить маршрут по умолчанию и наложить на него ограничение контроллера или сделать статическим имя контроллера (если применяется только один).