Моя первая мысль - это «плохая идея». Если вы можете взять что-нибудь , которое они могут бросить вам за URL, вам понадобится чертовски черный список (или белый список). Там так много открытий. Лучшим способом было бы явно прописать эти маршруты и то, как вы разрешаете параметры, а затем выполнить действия, связанные с этими принятыми маршрутами. Тогда у вас будет универсальный перехват всех маршрутов, который перенаправит на страницу ошибки.
Такое ощущение, что вы пытаетесь смешать яблоки и апельсины. ASP.NET MVC целенаправленно устраняет идею «страницы». На самом деле нет причин иметь каталоги для разных пользователей, если только вы не выполняете какой-либо файловый ввод-вывод, и в этом случае его можно абстрагировать для работы в парадигме ASP.NET MVC гораздо проще, чем вы думаете.
В ASP.NET MVC, если вы хотите варьировать информацию, которую вы ищете, в зависимости от переданной строки (очень похоже на строку, которую вы пропустили), вот «безопасный» способ сделать это:
Метод № 1 - три маршрута, три действия, разные имена
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "ShowByYear" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "ShowByYearAndMonth" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "ShowByYearMonthAndName" },
new { year = @"\d{4}", month = @"\d{2}" }
);
И затем вы будете использовать переданные значения маршрута в ваших действиях контроллера, чтобы определить, как они видят данные:
ShowByYear(string year)
{
//Return appropriate View here
}
ShowByYearAndMonth(string year, string month)
{
//Return appropriate View here
}
ShowByYearMonthAndName(string year, string month, string name)
{
//Return appropriate View here
}
Метод № 2 - Предлагаемый метод
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}", name = "" }
);
Show(string year)
{
//
}
Show(string year, string month)
{
//Return appropriate View here
}
Show(string year, string month, string name)
{
//Return appropriate View here
}
Прелесть этого подхода в том, что MapRoute
обрабатывает разбор URL; и держится в стороне Затем вы можете настроить маршрут для всех сообщений, который просто выдаст ошибку. Вы бы предпочли, чтобы некоторые разборы выполнялись на стороне маршрута с regex
, чем в вашем контроллере (на мой взгляд).
Это сокращает до трех перегруженных действий и позволяет получить более чистый и более код MVC.