ASP.NET Маршрутизация MVC для одного сайта контроллера

StackOverflow https://stackoverflow.com/questions/1601211

  •  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 код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top