2012-01-25 11 views
2

MVCで過去9ヶ月間に自分自身を吸収してしまったので、私が苦労していると思われるエリアはエリアとルーティングです。MVC3のエリア、ルーティングとURL

誰が助けることがあれば質問のカップル:

1)MVC3アプリケーションとそれが関連付けられています可能な領域は、異なるURLがありますか?

例:

  • メインアプリ(ルート)= www.mymvcapp.com
  • モバイルアプリ(面積)= m.mymvcapp.com
  • 管理アプリケーション(面積)= admin.mymvcapp。 comの
  • たCustomerService(面積)= custsvc.mymvcapp.com

など、など、など...

事前にご理解いただけるヒントや解決策MVCの多くの書籍は、一般的にエリアとルーティングを覆すようになっているようです。

この場合も、これは「エリア」とルーティングに非常に特有です。

ありがとうございます。

EDIT 2012年1月26日:

まず最初に動作するように実際の面積を取得することでした。私は昨日遅くにびっくりするまでこれで運がなかった。

"ホーム"コントローラと単一の "インデックス"アクションメソッドとビューを持つテストMVCプロジェクト(MvsAreas)を作成しました。 :)

「Admin」という名前の領域が追加され、「HomeController」というコントローラが追加され、「Index」アクションメソッドとビューが1つ追加されました。

ホームコントローラが2つあるため、実行時エラーが発生します。解決策:名前空間を使用し、オーバーロードされた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

ルセロのリンク(これは私に正しい方向を指してくれてありがとう、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今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 

を変更

 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 

を変更

は今、www.mvcareas.comはに私をもたらしますルートホームコントローラーからの正しい索引アクション。

admin.mvcareas.comに入力すると、管理領域のホームコントローラから正しいインデックスアクションが適用されます。

すべてが順調で、私は幸せなキャンピングカーです。 :)

私はこれが領域、URL、およびルーティングの概念の非常に単純化されたアプリケーションであることを知っています。しかし、うまくいけば、この投稿は、それをより良く理解しようとしている人を助けてくれます。私は、プロジェクトのための特定のURL要件を満たす方法を見てください。

Lucero、リンクについてもう一度感謝します。

+0

興味深いことに、ActionLinkまたはRouteLink Htmlヘルパーを使用してエリア間のリンクを生成しようとしても機能しない場合、検索は続行されます。 :) –

関連する問題