Как я могу создать маршрут, который возвращает URL без ссылки на контроллер в ASP.NET MVC - PullRequest
1 голос
/ 07 февраля 2010

У меня есть вызов контроллера DefaultController. Внутри этого контроллера у меня есть представления о том, что будет эквивалентно статическим страницам.

URL-адреса выглядят как www.site.com/Default/PageName

Можно ли создать маршрут, который бы форматировал эти URL как:

www.site.com / PageName

Я хочу избежать создания контроллеров для каждого из них. Альтернативой может быть создание страниц ASPX в корне, но могу ли я создать маршруты для этих страниц, например:

www.site.com / PageName.aspx становится www.site.com/PageName?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 февраля 2010

Вы можете создать явный маршрут для действия PageName на DefaultController следующим образом:

routes.MapRoute(
    "PageName",
    "pagename",
    new { controller = "DefaultController", action = "PageName" }
);

Вы должны поставить этот маршрут перед маршрутом MVC по умолчанию. Самым большим недостатком этого подхода является то, что вам нужно создать один маршрут для статической страницы.

Альтернативным подходом было бы добавить дополнительный маршрут после маршрута MVC по умолчанию:

routes.MapRoute(
    "DefaultController",
    "{page}/{*path}",
    new { controller = "DefaultController", action = "{page}" }
);

Недостатком этого подхода является то, что это правило будет обрабатывать все URL-адреса, даже те, которые обычно возвращают 404.

1 голос
/ 07 февраля 2010

Первый подход

Создайте маршрут, который ловит действия:

routes.MapRoute(
    "Catcher1",
    "{action}",
    new { controller = "Default", action = string.Empty });

Но это означает, что вам придется создать столько же действий контроллера на контроллере по умолчанию.

Второй подход

Если вы также хотите избежать этого и вместо этого иметь только один контроллер + действие, напишите маршрут следующим образом:

routes.MapRoute(
    "Catcher2",
    "{path}",
    new { controller = "Default", action = "PageName", path = string.Emtpy },
    new { path = @"[a-zA-Z0-9]+" });

Этот маршрут также определяет маршрутограничение, поэтому он будет ловить только те маршруты, которые на самом деле имеют что-то в первом сегменте маршрута.Вы можете определить это ограничение, чтобы перехватывать только те запросы, которые вам нужны (т.е. path = "Result|Search|Whatever")

, тогда ваш DefaultController будет выглядеть примерно так:

public ActionResult PageName(string path)
{
    // code goes here
}

Второй подход кажется оченьвыполнимо, но я бы не рекомендовал это, потому что вся логика должна проходить через это действие контроллера (для такого рода запросов).Было бы лучше разделить эти действия на логические.Те, которые на самом деле делают одно и то же (поэтому у них не было бы набора switch операторов или аналогичных), будут определены с отдельными маршрутами (если они не могут быть выполнены с использованием одного).

...