2017-02-16 7 views
2

Ich habe Probleme mit den Routings in meinem MVC-Projekt nicht funktioniert ...Spezielle MVC Routing nicht funktioniert

Ich möchte alle meine Ansichten in der Views > Shared Ordner wie folgt aus:

Error.cshtml (default)
Index.cshtml (default)
Overview.cshtml (custom, die ich gemacht)
Recordings.cshtml (custom, die ich gemacht)

Ich habe erstellt dann einen gemeinsamen Controller alle Ansichten wie diese zu behandeln:

public class SharedController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Error() 
    { 
     return View(); 
    } 

    public ActionResult Overview() 
    { 
     return View(); 
    } 

    public ActionResult Recordings() 
    { 
     return View(); 
    } 
} 

Mein RouteConfig.cs sieht wie folgt aus:

:

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

    // Map to specific pages under Shared controller: 
    routes.MapRoute("SharedPages", "{action}/{id}", 
     new { controller = "Shared", action = @"Overview|Recordings", id = UrlParameter.Optional }); 

    // Use the default rout for all other pages: 
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional } 
    ); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

ich das Routing wie diese arbeiten möchten

: // (url)/(root - keine Aktion angegeben) -> Freigegeben/Index.cshtml
: // (url)/Index -> Freigegeben/Index.cshtml
: // (url)/Übersicht -> Freigegeben/Übersicht.cshtml
: // (url)/Aufnahmen -> Shared/Recordings.cshtml
: // (url)/was auch immer (oder wenn ein Fehler tritt auf)

Aber es funktioniert nicht wie erwartet. Wenn ich zu ://(url)/ (root) gehe, bekomme ich eine HTTP 404 - The resource cannot be found. Wenn ich zum Beispiel gehe ://(url)/Overview, es funktioniert gut.

Wie kann ich es so machen, wie ich will?

+0

testen: http: // Stackoverflow .com/a/11474788/231716 –

Antwort

0

Die Reihenfolge, in der Sie die Route planen, ist wichtig und die erste passende Route gewinnt. Das heißt, auch wenn dort keine Ressource vorhanden ist, stimmt sie mit der Route überein, in der sie verwendet wird.

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

    // Use specific rout for all other pages: 
    routes.MapRoute("WhateverA", "WhateverA/{action}/{id}", 
     new { controller = "WhateverA", action = "Index", id = UrlParameter.Optional } 
    ); 

    routes.MapRoute("WhateverB", "WhateverB/{action}/{id}", 
     new { controller = "WhateverB", action = "Index", id = UrlParameter.Optional } 
    ); 

    // Map to specific pages under Shared controller: 
    routes.MapRoute("RootPages", "{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional }); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

Das Problem mit den Default und SharedPages Routen ist, dass sie miteinander in Konflikt geraten. Sie müssen möglicherweise bestimmte Routen für andere Controller bereitstellen, sofern diese vorhanden sind. Andere weisen die andere Option ist, Routing zu verwenden Attribut für die anderen Steuerungen und Kongressbasiertes Routing für Ihre Root-Routen und Fehler

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

    //Attribute routing 
    routes.MapMvcAttributeRoutes(); 

    // Map to specific pages under Shared controller: 
    routes.MapRoute("RootPages", "{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional }); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

Bei Controllern dekoriert entsprechend

[RoutePrefix("WhatEver")] 
public class WhatEverController : Controller { 
    //GET whatever 
    [HttpGet] 
    [Route("")] 
    public ActionResult Index() { ... } 
} 
+0

Alles mit Null, 1, 2 oder 3 Segmenten in der URL wird mit dem 'Default' übereinstimmen und die' SharedPages' Route wird nie getroffen werden –

+0

@StephenMuecke, Yeah wegen der Standardwerte. guter Fang. Ich werde diese Antwort noch einmal überprüfen müssen. – Nkosi

+0

Wenn OP den Controller-Namen weglassen möchte, dann ist eine bestimmte Route für jede Methode erforderlich, oder eine Routenbeschränkung (vorausgesetzt, es gibt andere Controller) –