Как использовать asp.net MVC маршруты для создания домашней страницы в стиле Twitter - PullRequest
1 голос
/ 12 ноября 2009

Я пытаюсь создать 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
        );

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

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

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

0 голосов
/ 12 ноября 2009

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

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

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

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

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

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()} _
       )

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

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

0 голосов
/ 12 ноября 2009

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

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 = "" }  
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...