2016-03-31 17 views
1

Ich habe eine ASP.NET MVC App. Ich habe ähnliche Fragen gestellt. Ich habe jedoch keine gute Antwort gefunden. Im Wesentlichen möchte ich die folgenden Routen verwenden:ASP.NET MVC - Nesting Routes/Controllers

/admin/users 
/admin/users/create 
/admin/users/[someId] 
/admin/roles 
/admin/roles/create 
/admin/roles/[someId] 

ich die folgende Dateistruktur haben:

/Controllers 
    AdminController.cs 
    /Admin 
    UsersController.cs 
    RolesController.cs 
/Views 
    /Admin 
    Index.cshtml 
    /Users 
     Index.cshtml 
     Detail.cshtml 
     Create.cshtml 
    /Roles 
     Index.cshtml 
     Create.cshtml 
     Detail.cshtml 

Wenn ich meine app laufen, bekomme ich nur The resource cannot be found.

Was ich tue, falsch ? Ich setze Haltepunkte, aber keiner von ihnen wird getroffen. Es ist so, als würden die Routen den Controllern nicht zugeordnet. Ich bin mir nicht sicher, was ich tun muss.

+2

Ihre Dateistruktur spielt keine Rolle.Ihre Routen sind wichtig, aber Sie haben sie nicht in Ihre Frage aufgenommen. – mason

+1

Standardmäßig finden Sie Ihre RouteConfig.cs im Ordner App_Start. Vielleicht zeigen Sie es zu Ihrer Frage hinzufügen. –

Antwort

4

Sie müssen keine Unterordner erstellen, damit dies funktioniert. Haben Sie nur 2 Controller (UsersController und RolesController) und Sie können Attribut-Routing verwenden, um das benutzerdefinierte Routing-Muster, das Sie wollen, zu definieren.

Angenommen, Sie Routing-Attribut aktiviert

public class UsersController : Controller 
{ 
    [Route("admin/users")] 
    public ActionResult Index() { // to do : Return something } 

    [Route("admin/users/create")] 
    public ActionResult Create() { // to do : Return something } 

    [Route("admin/users/{id}")] 
    public ActionResult View(int id) { // to do : Return something }  
} 

Oder Sie können die RoutePrefix auf der Controller-Ebene tun.

[RoutePrefix("admin/users")] 
public class UsersController : Controller 
{ 
    [Route("")] 
    public ActionResult Index() { // to do : Return something } 

    [Route("create")] 
    public ActionResult Create() { // to do : Return something } 

    [Route("{id}")] 
    public ActionResult View(int id) { // to do : Return something }  
} 

Sie können das gleiche auch für die RolesControllers tun.

Sie können das Attribut-Routing in der RegisterRoutes-Methode in der Datei RouteConfig.cs aktivieren.

Sie können auch in Betracht ziehen, einen "Admin" -Bereich zu erstellen und Ihre Controller darin zu platzieren. Areas sind die richtige Lösung, wenn Sie ähnliche Funktionen logisch gruppieren möchten.

Wenn Sie das Attribut-Routing nicht bevorzugen (warum nicht?), Definieren Sie diese benutzerdefinierten Routenmuster in Ihrer RouteConfig. Die Reihenfolge, in der Sie die Route definieren, ist von Bedeutung. Stellen Sie sicher, dass Sie Ihre spezifischen Routen vor der standardmäßigen generischen Adresse definieren.

+0

Gibt es eine Möglichkeit für mich, Unterordner zu verwenden? Ich werde viele Controller unter der Admin-Route haben. Das ist ein Grund, warum ich Unterordner verwenden möchte. – user70192

+0

Sie können Unterordner verwenden. Solange Ihre Klassennamen mit 'Controller' enden, wird es abgeholt. Wenn Sie Funktionen/Controller logisch gruppieren möchten, sollten Sie einen Admin-Bereich erstellen. – Shyju

0

Sie können Ihre Routentabellen auch überschreiben, indem Sie Ihre Aktionsmethoden mit der Klasse RouteAttribute dekorieren.

Zum Beispiel:

class AdminController 
{ 
    [Route("/admin/users/create")] 
    public ViewResult CreateUser() 
    { 
     ... 
    } 
} 

Dies hat den Vorteil, dass die Methodennamen aus der URL-Komponente zu trennen.

Sie können damit auch mehrere URLs zu einer einzigen Methode:

class AdminController 
{ 
    [Route("/admin/users/{someId:guid}")] 
    [Route("/admin/users/{someId:guid}/details")] 
    public ViewResult UserDetails(Guid someID) 
    { 
     ... 
    } 
} 

Als Maurer sagte, die Dateistruktur ist in MVC Routing nicht wichtig.

0

Wenn Sie Convention (Ordner) -basiertes Routing verwenden möchten, können Sie MvcCodeRouting verwenden, um genau das zu tun, was Sie hier angegeben haben. Es verwendet standardmäßig Namespaces. Wenn Sie also Controller in einer Hierarchie hinzufügen, generiert es automatisch Routen in derselben Hierarchie. Sie müssen das Attribut [Route] nicht überall anwenden und Ihre Routen manuell einrichten.