ASP.NET Маршрутизация MVC для одного сайта контроллера
-
05-07-2019 - |
Вопрос
Я пытаюсь создать простой сайт.В основном у него есть один контроллер Home
контроллер.
У этого контроллера есть действие Index
занимает string
в качестве аргумента (который является каталогом) и использует этот "каталог" для выполнения своей работы.
Я не могу понять, как создать универсальный маршрут для всех, который будет отправлять каждый URL-адрес для этого одного действия.
Может существовать любая комбинация URL-адресов, и все, что находится за пределами доменного имени, должно быть строкой.
http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred
Кто-нибудь знает, как это сделать?Также было бы неплохо, если бы все значения передавались в виде списка.
Есть ли лучший способ сделать это?
Решение
Попробуй это :
routes.MapRoute(
"Default", "{*path}",
new { controller = "Home", action = "Index" }
);
И контроллер :
public class HomeController : Controller {
public ActionResult Index(string path) {
return View();
}
}
Другие советы
Моя первая мысль заключается в том, что это "плохая идея".Если вы можете взять что угодно они могут запросить у вас 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 код.