Как использовать маршруты asp.net MVC для создания домашней страницы в стиле Twitter

Я пытаюсь создать twitter.com/rob для перехода на динамическую страницу (используя учетную запись/viewuser), а также разрешить twitter.com/help перейти на страницу справки (help/index).

Приведенный ниже код не работает ни в том, ни в другом порядке, потому что обработчик маршрута по умолчанию всегда выбирает идентификатор в качестве контроллера, поскольку контроллер/действие/идентификатор являются необязательными.

Есть ли способ сделать это, не определяя каждую страницу веб-сайта заранее в global.asax.cs?


        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "UserHomepage",                                               // Route name
            "{id}",                                                       // URL with parameters
            new { controller = "Account", action = "ViewUser", id = "" }  // Parameter defaults
        );

person Rob Ellis    schedule 12.11.2009    source источник


Ответы (3)


вы можете поместить второй маршрут ("UserHomePage") перед Default. Маршруты оцениваются в том порядке, в котором они появляются в коде.

Тем не менее, в настоящее время http://yoursite/ переходит к http://yoursite/Home/Index, и если вы сделаете предложенное изменение, оно перейдет к http://yoursite/Account/ViewUser (я не понимаю, какое отношение к этому имеет Твиттер). Вам нужно решить, какое поведение желательно, и соответствующим образом спроектировать маршруты.

person Felix    schedule 12.11.2009
comment
Это была моя первая мысль, но, как вы сказали, домашняя страница умирает. Твиттер — пример поведения, которого я хочу. - person Rob Ellis; 13.11.2009

Вы можете добавить ни один пользовательский маршрут, прежде чем добавить маршрут учетной записи пользователя. Бывший

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

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

routes.MapRoute(
        "UserHomepage",                                               
        "{id}",                                                       
        new { controller = "Account", action = "ViewUser", id = "" }  
    );
person Carl Bergquist    schedule 12.11.2009
comment
Привет, Карл. Это означает, что я должен определить все контроллеры. Это мой запасной план! - person Rob Ellis; 13.11.2009

Сначала поместите маршрут «UserHomepage». Тогда он должен сделать это так, как объяснил @Felix выше. Насколько это возможно, сделайте свой маршрут по умолчанию в конце.

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

если у вас есть http://yoursite.com/home, мы ожидаем, что это попадет на ваш "home/index" как то, что определено на маршруте по умолчанию. Но маршрут UserHomepage идет первым перед маршрутом по умолчанию, поэтому ожидаемого нами не произойдет, вместо этого http://yoursite.com/home перейдет к "account/viewuser/home", рассматривая дом как идентификатор.

Решением этой проблемы является определение ограничения.

Что я сделал, так это определил класс ограничения

Public Class UserNameConstraint
    Implements IRouteConstraint

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
        Dim list As New List(Of String)
        list.Add("home") 'List of controller names

        For Each item In list
            If values("id").ToString() = item Then
                Return False
            End If
        Next

        Return True
    End Function
End Class

После определения ограничения измените свой маршрут, чтобы включить ограничение

 routes.MapRoute( _
            "UserHomepage", _
            "{id}", _
            New With {.controller = "Case", .action = "FriendlyName"}, _
            New With {.id= New UserNameConstraint()} _
       )

Этот маршрут теперь будет игнорироваться, если идентификатор указан в списке ограничения.

Вот и все. Надеюсь ты понимаешь. :)

person mark vanzuela    schedule 12.11.2009
comment
Потребовалось время, чтобы прийти в себя! Я действительно пытаюсь получить наименьшую конфигурацию. Как насчет добавления:- route.MapRoute(Домашняя страница, // Имя маршрута, // URL-адрес с параметрами new { controller = Home, action = Index, id = } // Параметры по умолчанию); - person Rob Ellis; 13.11.2009