2009-08-23 8 views
1

Je voudrais apprendre comment routage de préfixe d'installation comme il est dans cakephp pour le routage d'administration. Malheureusement, je n'ai pas compris comment faire cela dans ASP.NET MVC.Routage de préfixe dans ASP.Net MVC comme cakephp

Par exemple,

Si les types d'utilisateur dans/Admin/Gestion, je voudrais contrôleur Management.admin_index à appeler, sans changer l'URL. J'ai essayé ce que je pensais correct mais ça a fini par changer toutes mes urls.

Donc la question est: Si c'est possible, comment puis-je faire routage de préfixe dans ASP.NET MVC?

Mise à jour: C'est exactement ce que je cherchais. http://devlicio.us/blogs/billy_mccafferty/archive/2009/01/22/mvc-quot-areas-quot-as-hierarchical-subfolders-under-views.aspx Ce code vous permet d'avoir un site Web par défaut, puis une zone d'administration.

Répondre

2

Vous devriez peut-être essayer d'écrire un itinéraire personnalisé. Regardez System.Web.Routing.RouteBase.

* modifier *

Ok, j'ai eu un autre regard et je me suis trompé. Ce qui a d'abord été ma première pensée avéré être la solution plus facile: vous devez mettre en œuvre un IRouteHandler personnalisé comme celui-ci:

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); 
     } 
    } 
} 

Ensuite, faites un contrôleur avec deux actions, préfixe un d'eux avec « Admin », et la marque avec l'AuthorizeAttribute. Il devrait ressembler à ceci:

using System.Web.Mvc; 

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

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

    } 
} 

Faire un dossier « préfixée » dans le dossier Vues et ajouter deux vues en elle, un Test.aspx et un AdminTest.aspx. Ensuite, il vous suffit de remplacer la route par défaut (en Global.asax) avec ce code:

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 = "" }) 
    }); 
} 

Et c'est, quand vous naviguez maintenant sur le site/préfixés/Test en tant qu'utilisateur anonyme, vous devriez obtenir le test standard affichage, mais si vous êtes un administrateur, vous obtiendrez la vue AdminTest. Cependant, si un utilisateur anonyme tente d'accéder directement à l'URL AdminTest, il sera redirigé vers la page de connexion.

PS: Je peux confirmer cela fonctionne, si vous avez sou problèmes de mise en œuvre juste me donner un anneau;)

+0

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? –

+0

Ahh ok, ça ressemble à ce que je cherche. Je vais essayer plus tard aujourd'hui et revenir à vous. –

+0

pour gérer la zone suffit de définir les DataTokens ["zone"]. requestContext.RouteData.DataTokens ["area"] = requestContext.RouteData.Values ​​["yourCustomAreaToken"] – kite

0

Je pense que peut-être mettre en place un itinéraire pour cela? Avec cet exemple, vous devrez créer un itinéraire par contrôleur (admin).

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

Je suis encore assez nouveau aussi, mais je pense que cela pourrait être fait plus net. – jeef3

+0

Merci pour la réponse. Ce que je pense que je veux, c'est que si l'utilisateur tape Admin \ Management \ Index, ma requête est routée vers Management: admin_index(), ce qui est le préfixe de routage ... mais je ne sais pas comment cela est possible dans ASP.NET MVC . –

+0

Pour cela, vous pouvez créer une méthode d'action (méthode publique qui renvoie un ActionResult) appelée 'admin_index' et pré-présenter l'attribut' [ActionName ("Index")] ' Ce n'est pas tout à fait le routage de préfixe mais devrait donner le résultat souhaité? – jeef3

0

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