J'ai aussi cherché comment faire cela et figuré tout simplement.
Voici le code en VB (il ne devrait pas être difficile de traduire à C#)
Créer une classe implémentant 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
Ensuite, ajouter à votre 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
Vous remarquerez qu'il ya deux voies: préfixées admin/contrôleur/action et gestionnaire/contrôleur/action. Vous pouvez en ajouter autant que vous le souhaitez. Initialement, cela a semblé fonctionner jusqu'à ce que j'essaie d'utiliser Html.Actionlink pour créer des liens. Cela force ActionLink à ajouter une commande admin/à chaque URL générée. Donc, je l'ai corrigé. Cela devrait faire en sorte que le routage du préfixe fonctionne de la même façon que le routage d'administration de CakePHP.
ici est l'édition:
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
Il n'y a pas assez d'informations pour savoir si c'est une bonne réponse. Je demande spécifiquement comment faire le routage de préfixe dans ASP.NET MVC. Comment est-ce que le fait de regarder la classe de base m'aide? –
Ahh ok, ça ressemble à ce que je cherche. Je vais essayer plus tard aujourd'hui et revenir à vous. –
pour gérer la zone suffit de définir les DataTokens ["zone"]. requestContext.RouteData.DataTokens ["area"] = requestContext.RouteData.Values ["yourCustomAreaToken"] – kite