ASP.NET MVC twitter / myspace style маршрутизация - PullRequest
4 голосов
/ 15 января 2010

Это мой первый пост после того, как я долгое время скрывался, поэтому, пожалуйста, будьте осторожны: -)

У меня есть сайт, похожий на твиттер, в котором люди могут зарегистрироваться и выбрать «дружественный URL», поэтому на моем сайте у них будет что-то вроде:

mydomain.com / benjones

У меня также есть статические страницы корневого уровня, такие как:

mydomain.com / о

и, конечно, моя домашняя страница:

mydomain.com /

Я новичок в ASP.NET MVC 2 (на самом деле я только начал сегодня), и я настроил следующие маршруты, чтобы попытаться достичь вышеуказанного.

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("content/{*pathInfo}");
        routes.IgnoreRoute("images/{*pathInfo}");

        routes.MapRoute("About", "about",
            new { controller = "Common", action = "About" }
        );

        // User profile sits at root level so check for this before displaying the homepage
        routes.MapRoute("UserProfile", "{url}",
            new { controller = "User", action = "Profile", url = "" }
        );

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

По большей части это работает нормально, однако моя домашняя страница не запускается! По сути, когда вы заходите на сайт mydomain.com, кажется, что он запускает маршрут профиля пользователя с пустым параметром {url}, поэтому домашняя страница никогда не достигается! Любые идеи о том, как я могу показать домашнюю страницу?

Ответы [ 5 ]

2 голосов
/ 03 ноября 2011

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

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

public class NotControllerConstraint : IRouteConstraint
{
    private static readonly IEnumerable<Type> Controllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.BaseType == typeof(Controller));

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return Controllers.Where(c => c.Name == values["id"] + "Controller").Count() == 0;
    }
}

Маршруты можно настроить следующим образом:

 routes.MapRoute("User", "{id}", new { controller = "User", action = "Index" }, new { notController = new NotControllerConstraint() });

 routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
1 голос
/ 20 января 2010

Причина того, что обмен маршрутов работает, заключается в том, что маршрут {url} не имеет ограничений на пустые строки (каков ваш последний маршрут). В результате он сначала будет соответствовать пустой строке, поскольку он выше в таблице маршрутов.

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

Если вы хотите узнать, какие маршруты совпадают в данный момент, вы можете использовать Route Debugger от Phil Haack.

1 голос
/ 15 января 2010

Разве вы не можете поменять местами два нижних маршрута?

0 голосов
/ 08 апреля 2010

У меня есть настройка симлара, как показано ниже:

    routes.MapRoute(
        "Common",
        "common/{action}/{id}",
        new { controller = "common", action = "Index", id = "" }
    );

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


    routes.MapRoute(
        "Dynamic",
        "{id}",
        new { controller = "dynamic", action = "Index", id = "" }
        );

Это позволяет мне быть гибким и иметь маршруты

mysite.com /

mysite.com / общий / контакт / mysite.com/common/about/ mysite.com/common/{wildcard}/

mysite.com / {ничего}

0 голосов
/ 20 января 2010

Я искал, чтобы реализовать тот же стиль URL для моего приложения MVC 1.0.

У меня реализовано с информацией из этого поста и пост в блоге Гая Бурштейна.

Спасибо, что поделились:)

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