MVC3区域,路由和URL

时间:2012-01-25 19:38:41

标签: asp.net-mvc-3

在过去9个月左右的时间里,我已经吸收了自己的MVC,我似乎正在努力解决的一个领域是区域和路由。

如果有人可以提供帮助,可以提出几个问题:

1。)MVC3应用程序及其关联区域可以有不同的Urls吗?

示例:

  • 主应用(root)= www.mymvcapp.com
  • 移动应用(区域)= m.mymvcapp.com
  • 管理员应用(区域)= admin.mymvcapp.com
  • CustomerService(area)= custsvc.mymvcapp.com
等等等......

任何提示或解决方案都提前非常感谢。看起来很多关于MVC的书籍似乎只是对区域和路由进行釉面化。

同样,这非常特定于“AREAS”和路由。

提前致谢。

编辑2012年1月26日:

首先要让实际区域发挥作用。在我昨天晚些时候潜水之前,我一直没有运气。

我创建了一个带有“Home”控制器和单个“Index”操作方法和视图的测试MVC项目(MvsAreas),到目前为止还不错。 :)

添加了一个名为“Admin”的区域,添加了一个名为“HomeController”的控制器,并添加了一个“索引”操作方法和视图。

因为我有两个家庭控制器,所以会出现运行时错误。解决方案:使用命名空间,然后使用重载的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

这将使该区域和根工作。

下一步;尝试使用下面的一些参考链接来设置网址。

如果有人有任何建议,请随时添加。

1 个答案:

答案 0 :(得分:2)

使用Lucero的链接(谢谢BTW 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让我从根管理控制器转到正确的索引操作。

当我进入admin.mvcareas.com时,我会从管理区域主控制器获得正确的索引操作。

一切都很好,我是一个快乐的露营者。 :)

顺便说一句,我知道这是一个非常简单的区域,网址和路由概念应用。但希望这篇文章可以帮助那些试图更好地理解或喜欢我的人,看看我们如何能够满足项目的某些特定网址要求。

Lucero,再次感谢这个链接。