MVC3 области, маршрутизация и URL - PullRequest
2 голосов
/ 25 января 2012

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

Несколько вопросов, если кто-то может помочь:

1.) Может ли приложение MVC3 и связанные с ним области иметь разные URL-адреса?

Пример:

  • Главное приложение (root) = www.mymvcapp.com
  • Мобильное приложение (область) = m.mymvcapp.com
  • Приложение администратора (область) = admin.mymvcapp.com
  • CustomerService (область) = custsvc.mymvcapp.com

и т. Д., И т. Д. ...

Любые советы или решения, заранее оцененные.Просто кажется, что во многих книгах о MVC просто говорится о областях и маршрутизации в целом.

Опять же, это довольно специфично для "областей" и маршрутизации.

Спасибозаранее.

РЕДАКТИРОВАТЬ 26 ЯНВАРЯ 2012 ГОДА:

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

Я создал тестовый проект MVC (MvsAreas) с контроллером "Home" и одним методом и видом действия "Index", так что хорошодо сих пор.:)

Добавлена ​​область с именем "Admin", добавлен контроллер с именем "HomeController" и добавлен один метод и представление действия "Index".

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

Контроллер корневого приложения:

Namespace MvcAreas.Web.Mvc.Controllers

    Public Class HomeController
        Inherits Controller

        Function Index() As ActionResult

            Return View()

        End Function

    End Class

End Namespace

Контроллер области администратора:

Namespace MvcAreas.Areas.Admin.Controllers

    Public Class HomeController
        Inherits Controller

        Function Index() As ActionResult

            Return View()

        End Function

    End Class

End Namespace

Global.asax

Namespace MvcAreas.Web.Mvc

    Public Class MvcApplication
        Inherits HttpApplication

        Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)

            filters.Add(New HandleErrorAttribute())

        End Sub

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

            routes.MapRoute(
                "Root_Default",
                "{controller}/{action}/{id}",
                New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional},
                New String() {"MvcAreas.Web.Mvc.Controllers"}
            )

        End Sub

        Sub Application_Start()

            AreaRegistration.RegisterAllAreas()

            RegisterGlobalFilters(GlobalFilters.Filters)
            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

End Namespace

AdminAreaRegistration.vb

Namespace MvcAreas.Areas.Admin

    Public Class AdminAreaRegistration
        Inherits AreaRegistration

        Public Overrides ReadOnly Property AreaName() As String
            Get
                Return "Admin"
            End Get
        End Property

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)

            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional},
                New String() {"MvcAreas.Areas.Admin.Controllers"}
            )

        End Sub

    End Class

End Namespace

Это приведет к работе области и корня.

Следующий шаг;попытайтесь использовать некоторые из приведенных ниже ссылок для настройки URL-адресов.

Если у кого-либо есть какие-либо предложения, пожалуйста, не стесняйтесь добавлять.

1 Ответ

2 голосов
/ 26 января 2012

Используя ссылку Lucero (спасибо, кстати, Lucero, это указало мне верное направление), я смог заставить это работать.

Добавляя к вышеупомянутому проекту, я добавил новый класс с именем "HostnameConstraint".

HomenameConstraint.vb

Namespace MvcAreas.Web.Mvc.Constraints

    Public Class HostnameConstraint
        Implements IRouteConstraint

        Protected Property Hostname As String

        Public Sub New(hostName As String)

            Me.Hostname = hostName

        End Sub

        Private Function Match(httpContext As HttpContextBase, route As Route, parameterName As String, values As RouteValueDictionary,
                               routeDirection As RouteDirection) As Boolean Implements IRouteConstraint.Match

            If httpContext.Request.Url.Host = Me.Hostname Then
                Return True
            End If

            Return False

        End Function

    End Class

End Namespace

Прежде чем я продолжу, вам нужно настроить IIS для любых имен хостов, которые вы хотите связать с сайтом (я знаю, что это довольно очевидно, но кто-то спросит). :)

Теперь измените Global.asax

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

            routes.MapRoute(
                "Test2",
                "{controller}/{action}",
                New With {.controller = "Home", .action = "Index"},
                New With {.hostname = New MvcAreas.Web.Mvc.Constraints.HostnameConstraint("www.mvcareas.com")},
                New String() {"MvcAreas.Web.Mvc.Controllers"}
                )

        End Sub

Теперь измените AdminAreaRegistration.vb

Public Overrides Sub RegisterArea(ByVal context As AreaRegistrationContext)

    context.MapRoute(
        "Admin",
        "{controller}/{action}",
        New With {.controller = "Home", .action = "Index"},
        New With {.hostname = New MvcAreas.Web.Mvc.Constraints.HostnameConstraint("admin.mvcareas.com")},
        New String() {"MvcAreas.Areas.Admin.Controllers"}
        )


End Sub

Теперь, когда я запускаю приложение, www.mvcareas.com подводит меня к правильному действию Index с корневого домашнего контроллера.

Когда я захожу на admin.mvcareas.com, меня переводят на правильное действие индекса из контроллера домашней области администратора.

Все хорошо, и я счастливый турист. :)

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

Лусеро, еще раз спасибо за ссылку.

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