在过去9个月左右的时间里,我已经吸收了自己的MVC,我似乎正在努力解决的一个领域是区域和路由。
如果有人可以提供帮助,可以提出几个问题:
1。)MVC3应用程序及其关联区域可以有不同的Urls吗?
示例:
任何提示或解决方案都提前非常感谢。看起来很多关于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
这将使该区域和根工作。
下一步;尝试使用下面的一些参考链接来设置网址。
如果有人有任何建议,请随时添加。
答案 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,再次感谢这个链接。