Маршрутизация ASP.NET MVC для сайта с одним контроллером - PullRequest
4 голосов
/ 21 октября 2009

Я пытаюсь создать простой сайт. В основном это один контроллер Home.

Этот контроллер имеет действие Index принимает string в качестве аргумента (который является каталогом) и использует этот «каталог» для своей работы.

Я не могу понять, как создать общий перехват всех маршрутов, который будет отправлять все URL-адреса для этого действия.

Может существовать любая комбинация URL, и все, кроме имени домена, должно быть строкой.

http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred

Кто-нибудь знает, как это сделать? Также было бы хорошо, если бы все значения передавались в виде списка.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 21 октября 2009

Попробуйте это:

routes.MapRoute(
        "Default", "{*path}",
        new { controller = "Home", action = "Index" } 
    );

И контроллер:

public class HomeController : Controller {
    public ActionResult Index(string path) {
        return View();
    }
}
2 голосов
/ 21 октября 2009

Моя первая мысль - это «плохая идея». Если вы можете взять что-нибудь , которое они могут бросить вам за 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...