2009-08-23 12 views
1

adminルーティングのためにcakephpにあるようなセットアッププレフィックスルーティングがどのようになっているかを知りたいと思います。残念ながら、私はASP.NET MVCでこれを行う方法を理解していません。例えばASP.NetのプレフィックスルーティングcakephpのようなMVC

、中/管理者/管理ユーザータイプの場合

、私は、コントローラManagement.admin_indexは、URLを変更せずに、呼ばれるようにしたいと思います。私は正しいと思ったことを試しましたが、すべてのURLを変更してしまいました。

質問があります:可能であれば、ASP.NET MVCでプレフィックスルーティングを行うにはどうしたらいいですか?

更新:これは私が探していたものです。 http://devlicio.us/blogs/billy_mccafferty/archive/2009/01/22/mvc-quot-areas-quot-as-hierarchical-subfolders-under-views.aspxこのコードでは、既定のWebサイトを持ち、管理者エリアを持つことができます。

答えて

2

多分あなたはカスタムルートを作成してみるべきです。 System.Web.Routing.RouteBaseを見てください。

*編集*

[OK]を、私は別の顔を持っていたし、私が間違っていました。何が最初に私の最初の考えは簡単に解決策であることが判明した。その後、

using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace PrefixRoutingTest.Util 
{ 
    public class PrefixRouteHandler : IRouteHandler 
    { 
     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      //only apply this behavior to a part of the site 
      if (requestContext.HttpContext.Request.Path.ToLower().StartsWith("/prefixed/") && 
       requestContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       //prefix the action name with Admin 
       var action = requestContext.RouteData.Values["action"].ToString(); 
       requestContext.RouteData.Values["action"] = "Admin" + action; 
      } 

      return new MvcHandler(requestContext); 
     } 
    } 
} 

「管理者」、および印を持つ2つのアクション、接頭それらのいずれかでコントローラを作る:あなたはこのようなカスタムIRouteHandlerを実装する必要がありますAuthorizeAttributeを使用します。

using System.Web.Mvc; 

namespace PrefixRoutingTest.Controllers 
{ 
    public class PrefixedController : Controller 
    { 
     public ActionResult Test() 
     { 
      return View(); 
     } 

     [Authorize] 
     public ActionResult AdminTest() 
     { 
      return View(); 
     } 

    } 
} 

ビュー]フォルダに「接頭語」フォルダを作成し、その中の2つのビューTest.aspxというおよびAdminTest.aspxを追加します。それは次のようになります。そして、あなたはこのコードで(Global.asaxの中)デフォルトルートを交換する必要があります。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.Add("Default", new Route("{controller}/{action}/{id}", new PrefixRouteHandler()) 
    { 
     Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }) 
    }); 
} 

そして、それはそれだ、あなたが今、匿名ユーザーとしてサイト/同一キー/テストに移動するときには、標準的なテストを取得する必要があります管理者の場合はAdminTestビューが表示されます。ただし、匿名ユーザーがAdminTest URLに直接アクセスしようとすると、ログインページに送信されます。

PS:私は、この作品を確認することができ、SOUあなたが実装に問題がある場合、それはちょうど私に指輪を与える;)私もこれを行う方法を探してきた

+0

これは良い答えであるかどうかを知るには十分な情報がありません。私は特にASP.NET MVCでプレフィックスルーティングを行う方法を尋ねます。ベースクラスを見て私を助けてくれますか? –

+0

ああ、これは私が何をしているかのようです。私は今日後でそれを試して、あなたに戻ってきます。 –

+0

は、DataTokens ["area"]を設定するだけです。 requestContext.RouteData.DataTokens ["area"] = requestContext.RouteData.Values ["yourCustomAreaToken"] – kite

0

私は多分それのためのルートを設定すると思いますか?

この例では、ルート(管理者)コントローラを作成する必要があります。

routes.MapRoute(null, 
    "Admin/{controller}/{action}/", 
    new { controller = "Management", action = "Index" }); 
+0

また、私はまだかなり新しいんだけど、私はこれが整然と行うことができると思います。 – jeef3

+0

答えをありがとう。私が欲しいと思うのは、ユーザーがAdmin \ Management \ Indexに入力した場合、私のリクエストは管理:admin_index()にルーティングされます。これはプレフィックスルーティングがどのようなものかですが、ASP.NET MVCでどのようにできるかわかりません。 –

+0

これは、 'admin_index'というアクションメソッド(ActionResultを返すパブリックメソッド)を作成し、' [ActionName( "Index")] '属性をプリペンドすることができます。 プレフィックスルーティングはあまりありませんが、 – jeef3

0

、ちょうどそれを考え出しました。

ここでVBのコード(C#に変換するために難しいことではありません)


がIRouteHandlerを実装するクラスを作成している:

Imports System.Web 
Imports System.Web.Mvc 
Imports System.Web.Routing 

Namespace Util.Routing 
    ''' <summary> 
    ''' This Route Handler looks for a 'prefix' part in the url. If found, it appends the prefix to the action name. 
    ''' Example: /prefix/controller/action 
    ''' Turns into: /controller/prefix_action 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Class PrefixRouteHandler 
     Implements IRouteHandler 

     Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler Implements System.Web.Routing.IRouteHandler.GetHttpHandler 
      Dim prefix = requestContext.RouteData.Values("prefix") 
      If (prefix IsNot Nothing) Then 
       ' If prefix actually exists in the beginning of the URL 
       If (requestContext.HttpContext.Request.Path.ToLower().StartsWith("/" & prefix.ToString.ToLower() & "/")) Then 
        Dim action = requestContext.RouteData.Values("action") 
        If action Is Nothing Then 
         action = "index" 
        End If 
        requestContext.RouteData.Values("action") = prefix & "_" & action 
       End If 
      End If 
      Return New MvcHandler(requestContext) 
     End Function 
    End Class 
End Namespace 

次に、これを追加あなたのglobal.asax。VB:管理者/コントローラ/アクション、およびマネージャー/コントローラ/アクション:

Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
    routes.IgnoreRoute("{*favicon}", New With {.favicon = "(.*/)?favicon.ico(/.*)?"}) 
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}") 
    ' MapRoute takes the following parameters, in order: 
    ' (1) Route name 
    ' (2) URL with parameters 
    ' (3) Parameter defaults 
    routes.Add(New Route("admin/{controller}/{action}/{id}", _ 
        New RouteValueDictionary(New With {.prefix = "Admin", .controller = "Home", .action = "Index", .id = ""}), _ 
        New PrefixRouteHandler() _ 
       ) _ 
    ) 
    routes.Add(New Route("manager/{controller}/{action}/{id}", _ 
        New RouteValueDictionary(New With {.prefix = "Manager", .controller = "Home", .action = "Index", .id = ""}), _ 
        New PrefixRouteHandler() _ 
       ) _ 
    ) 
    routes.MapRoute("Default", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = "Home", .action = "Index", .id = ""} _ 
    ) 

End Sub 

次の2つの接頭辞のルートがあることがわかります。必要な数だけ追加することができます。

--Edit-- 最初は、Html.Actionlinkを使用してリンクを作成しようとするまで動作していたようでした。これにより、ActionLinkはすべての生成されたURLにadmin /を付加します。それで、私はそれを修正しました。これはプレフィックスルーティングがCakePHPの管理ルーティングと同様に変化する原因になります。ここ

が編集です:

Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
    routes.IgnoreRoute("{*favicon}", New With {.favicon = "(.*/)?favicon.ico(/.*)?"}) 
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}") 

    routes.Add("AdminPrefix", _ 
        New Route("{prefix}/{controller}/{action}/{id}", _ 
        New RouteValueDictionary(New With {.controller = "Home", .action = "Index", .id = "", .prefix = ""}), _ 
        New RouteValueDictionary(New With {.prefix = "admin"}), _ 
        New PrefixRouteHandler())) 
    routes.Add("ManagerPrefix", _ 
        New Route("{prefix}/{controller}/{action}/{id}", _ 
        New RouteValueDictionary(New With {.controller = "Home", .action = "Index", .id = "", .prefix = ""}), _ 
        New RouteValueDictionary(New With {.prefix = "manager"}), _ 
        New PrefixRouteHandler())) 
    routes.MapRoute("Default", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = "Home", .action = "Index", .id = ""} _ 
    ) 

End Sub 
関連する問題