2012-01-25 80 views
2

在過去9個月左右的已吸收自己在MVC中,一個區域,我似乎與掙扎的領域和路由。MVC3區,路由和URL

幾個問題,如果有人可以幫助:

1)能夠在一個MVC3應用程序和它相關的領域有不同的網址嗎?

實施例:

  • 主應用程序(根)= www.mymvcapp.com
  • 移動應用(區域)= m.mymvcapp.com
  • 管理員應用(區域)= admin.mymvcapp。 COM
  • 的CustomerService(區域)= custsvc.mymvcapp.com

等,等,等...

任何提示或解決方案提前非常感謝。看起來,MVC中的很多書籍都只是上傳區域和路由。

再次,這是非常具體的,以「區域」和路由。

在此先感謝。

編輯2012年1月26日:

第一件事就是獲得實際的區域合作。直到昨天晚些時候,我才得以幸運。

我創建了一個測試MVC項目(MvsAreas)與「家」控制器和一個「指數」的操作方法和觀點,讓好爲止。 :)

添加所謂的「系統管理員」的區域中,增加了一個被稱爲「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 

這將得到區域和根工作。

下一步;嘗試使用下面的一些參考鏈接來設置Url。

如果有人有任何建議,請隨時添加。

+1

可能重複的[主機名如何包含在MVC2路由映射?](http://stackoverflow.com/questions/4216098/how-can-host-name-be-included-in-mvc2-route-映射) – Lucero

+0

不一樣的問題,但接近。留下問題,因爲有人可能會有直接的答案。 –

+0

@Lucero,感謝您的鏈接,我實際上可以使用它並解決問題。 –

回答

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時,系統會從管理員區域主控制器接收到正確的索引操作。

一切都很好,我是一個快樂的露營者。 :)

順便說一句,我知道這是一個非常簡單的應用領域,網址和路由概念。但希望這篇文章可以幫助那些想更好地理解它或喜歡我的人,看看我們如何滿足項目的一些特定的url要求。

Lucero,再次感謝您的鏈接。

+0

有趣的是,嘗試使用ActionLink或RouteLink Html助手在區域之間生成鏈接不起作用,搜索仍在繼續。 :) –