2

Was ich versuche, ist dynamisches Routing für meine Anwendung.MVC, dynamisches Routing, Unity, Ermitteln, ob der aktuelle Controller in global.asax existiert

Zum Beispiel, in Application_BeginRequest() Ich möchte den aktuellen Controller und ermitteln, ob es existiert. Wenn nicht, möchte ich eine Reihe von Routen hinzuzufügen, die das Standard-Routing außer Kraft setzen, so dass meine URL wie dieses

mysite.com/term aus der Datenbank sieht

Aber, wenn der „Begriff aus der Datenbank“ a gültig ist Controller, ich möchte es das Standard-Routing verwenden

routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

Ich habe bereits meine Routen, wie ich will. Jetzt muss ich nur den aktuellen Controller und ermitteln, ob es existiert. Wenn ich meine keine benutzerdefinierten Routen hinzufügen, erhalte ich diesen Fehler:

The IControllerFactory 'MySite.Web.UnityControllerFactory' did not return a controller for a controller named 'term from database'.

Gibt es eine Möglichkeit die Einheit von der globalen zu verwenden, um festzustellen, ob der Controller vorhanden ist?

Danke!

Antwort

3

Warum erstellen Sie keine Dienstprogramm-Hilfsklasse, die Routen von Ihrer Datenbank registriert und dann Ihre Controller-Routen in Ihrer global.asax anwenden?

Da Ihre DB-Routen zuerst registriert werden, wenn sie eine gültige Route finden, würde sie diese zuerst verwenden. Oder Sie könnten es umgekehrt einstellen. Als zusätzliche Notiz würde ich sicherstellen, dass Ihre Routen von Ihrer DB einen zugehörigen Routenname haben, um Konflikte zu vermeiden.

 
public class Global : HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     //call utility to register routes from db 
     RouteHelper.RegisterRoutesFromDB(routes); 

     //now define my standard routes 
     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = "" } 
     ); 

     ... 
0

here ist eine Lösung. Damit können Sie alternative Routen für jede Route wie folgt definieren:

var defaultRoute = routes.MapReplaceableRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = 
    UrlParameter.Optional } 
     ); 

     var route = routes.MapRoute(
      name: "Dynamic", 
      url: "{name}", 
      defaults: new { controller = "Dynamic", action = "Index" }); 

     defaultRoute.AlternativeRoute = route;