2009-08-23 8 views
1

Ich würde gerne lernen, wie Setup Prefix Routing wie es in CakePHP für Admin-Routing ist. Leider habe ich nicht herausgefunden, wie man das in ASP.NET MVC macht.Prefix Routing in ASP.Net MVC wie CakePHP

Zum Beispiel

Wenn der Benutzer in/Admin/Management, würde ich Controller Management.admin_index gerne genannt werden, ohne die URL zu ändern. Ich habe versucht, was ich für richtig hielt, aber es hat letztendlich alle meine URLs geändert.

Die Frage ist also: Wenn es möglich ist, wie mache ich Prefix-Routing in ASP.NET MVC?

Update: Das ist genau das, was ich gesucht habe. http://devlicio.us/blogs/billy_mccafferty/archive/2009/01/22/mvc-quot-areas-quot-as-hierarchical-subfolders-under-views.aspx Mit diesem Code können Sie eine Standardwebsite und dann einen Adminbereich erstellen.

Antwort

2

Vielleicht sollten Sie versuchen, eine benutzerdefinierte Route zu schreiben. Sehen Sie sich System.Web.Routing.RouteBase an.

* edit *

Ok, ich hatte noch einen Blick und ich war falsch. Was war am Anfang dreht mein erster Gedanke heraus die einfachere Lösung sein:

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

Dann einen Controller mit zwei Aktionen, Präfix einer von ihnen mit ‚Admin‘ machen, und Zeichen: Sie einen benutzerdefinierten IRouteHandler wie folgt implementieren sollen es mit dem AuthorizeAttribute. Es sollte wie folgt aussehen:

using System.Web.Mvc; 

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

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

    } 
} 

Machen Sie einen ‚Vorangestellte‘ Ordner im Ordner Sichten und fügen Sie zwei Ansichten darin, eine Test.aspx und AdminTest.aspx. Dann müssen Sie nur die Standardroute ersetzen (in Global.asax) mit diesem 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 = "" }) 
    }); 
} 

Und das ist es, wenn Sie sich jetzt, um vor Ort/navigieren Vorangestellte/Test als anonyme Benutzer sollten Sie den Standard-Test bekommen anzeigen, aber wenn Sie ein Administrator sind, erhalten Sie die Ansicht AdminTest. Wenn ein anonymer Benutzer jedoch versucht, direkt auf die AdminTest-URL zuzugreifen, wird er zur Anmeldeseite gesendet.

PS: Ich kann bestätigen, das funktioniert, sou, wenn Sie Probleme haben, deren Umsetzung nur geben Sie mir einen Ring;)

+0

Es gibt nicht genug Informationen, um zu wissen, ob dies eine gute Antwort ist. Ich frage speziell, wie man Präfix-Routing in ASP.NET MVC macht. Wie hilft mir der Blick auf die Basisklasse? –

+0

Ahh ok, das sieht nach dem aus was ich suche. Ich werde es später später versuchen und zu dir zurückkommen. –

+0

um den Bereich zu behandeln, setzen Sie einfach den DataTokens ["Bereich"]. requestContext.RouteData.DataTokens ["Bereich"] = requestContext.RouteData.Values ​​["yourCustomAreaToken"] – kite

0

Ich denke, vielleicht eine Route für sie einrichten?

In diesem Beispiel müssten Sie eine Route pro (Admin-) Controller erstellen.

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

ich auch noch recht neu bin, aber ich denke, das ist aufgeräumter getan werden könnte. – jeef3

+0

Danke für die Antwort. Was ich glaube ich möchte, ist, wenn der Benutzer in Admin \ Management \ Index meine Anfrage wird an die Verwaltung geroutet: admin_index() was ist, was Präfix Routing ist ... aber ich weiß nicht, wie es in ASP.NET MVC möglich ist . –

+0

Dafür können Sie eine Aktionsmethode (öffentliche Methode, die ein ActionResult zurückgibt) mit dem Namen 'admin_index' erstellen und das Attribut' [ActionName ("Index") vorbereiten] ' Es ist nicht ganz Präfix Routing aber sollte das gewünschte Ergebnis geben? – jeef3

0

Ich habe auch die Suche, wie dies zu tun und dachte, es einfach aus. Hier

ist, den Code in VB (es sollte nicht schwer zu C# zu übersetzen)


Erstellen Sie eine Klasse Umsetzung 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 

Als nächstes fügen Sie diese Ihr 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 

Sie werden feststellen, dass es zwei Präfix Routen: admin/controller/action und Manager/controller/action. Sie können beliebig viele hinzufügen.

--Edit-- Zunächst schien das zu funktionieren, bis ich versuchte, mit Html.Actionlink Links zu erstellen. Dies veranlasst ActionLink, admin/an jede generierte URL anzuhängen. Also habe ich es korrigiert. Dies sollte bewirken, dass das Präfix-Routing ähnlich wie das Admin-Routing von CakePHP funktioniert.

hier ist die edit:

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