Tach!
Und schließlich Content-Negotiation: /index.html
liefert verschiedene Inhalte. Also ein URL, verschiedene Inhalte. Das kann man über die Klassenbindung regeln dass der URL bleibt aber wenn die Klassenbindung im URL kodiert ist, hast Du eben verschiedene URLs.
Wenn man das nicht möchte, kann man in ASP.NET MVC zusätzlich zur Route mit der Konvention {controller}/{action}/{id}
weitere Routen hinzufügen. Wenn bei gleicher URL auf unterschiedliche Controller geroutet werden sollen, dann kann man als URL-Muster auch mehrfach denselben festen Wert angeben und als Ziel verschiedene Controller/Actions angeben. Die Unterscheidung trifft man dann über einen Constraints-Parameter. Über den kann man Teile der URL anhand einer RegExp auswerten lassen oder eine selbst geschriebenen Klasse angeben, die den Request nach Strich und Faden auswerten kann, um zu entscheiden, ob die Route passt.
Ergibt Konvention und Konfiguration, ohne aus das jeweils andere verzichten zu müssen. Ich sehe weiterhin keinen Grund, auf Konvention zu verzichten, wenn diese es mir erspart, große Teile meiner Routen händisch konfigurieren zu müssen.
Beispiel gefällig?
routes.MapRoute(
name: "Test1",
url: "foo/{test}",
defaults: new { controller = "Home", action = "About" },
constraints:new { test = "bla" }
);
routes.MapRoute(
name: "Test2",
url: "foo/{test}",
defaults: new { controller = "Home", action = "Contact" },
constraints: new { test = "fasel" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Der dritte Methodenaufruf erstellt die Route, die nach Konvention aus den URL-Parametern den Controller und die Action ableitet, mit Defaultwerten für nicht vorhandene Teile.
Die ersten beiden Methodenaufrufe generieren Routen nach dem Prinzip der Konfiguration, indem zu beliebigen URLs beliebige Controller/Actions konfiguriert werden können. In dem Test-Projekt gibt es nur einen Controller mit drei Actions, deswegen ist das hier jedesmal derselbe Controller. Das Beispiel soll zeigen, dass man mit derselben URL auch zu unterschiedlichen Zielen routen kann. Das Unterscheidungskriterium ist hier der Einfachheit halber der zweite Teil der URL, weil ich dafür einfach ein RegExp-Muster in den Contraints angeben kann. Um wirklich dieselbe URL zu haben, müsste ich erst eine Klasse schreiben, die IRouteConstraint implementiert. Die kann dann auch andere Teile des Requests abseits der URL auswerten.
In .net würde ich so vorgehen, dass ich der index.html in der Routingtable einen Main Controller (oder sonstwas) zuordne, darin die relevanten Kriterien für variablen Content überprüfe und dann den gewünschten View erzeuge.
Ja, wenn das Auszuführende immer dasselbe oder größtenteils ähnlich ist, kann das derselbe Controller erledigen. Aber der ASP.NET-MVC-Router gibt mir die Flexibilität, auch unterschiedliche Controller unter derselben URL anzusprechen, wenn deutlich unterschiedliche Aufgagen zu erledigen sind. Wobei ich mir dann aber die Frage stelle, warum unter derselben URL grundverschiedene Dinge abgehandelt werden sollen, die eigene Controller erfordern.
Welche konfigurativen Möglichkeiten MVC an dieser Stelle noch bietet, darin bin ich nicht ganz so firm. Aber wenn's drum geht, je nach Berechtigung Content anzubieten, ist man konfigurativ vermutlich eh am Ende.
Nun, auch das kann ASP.NET MVC mit Konfiguration. Man schmückt Actions oder einen ganzen Controller mit einem Authorize-Attribut und gibt da an, welche Rollen zugreifen dürfen. Das ist die einfache Variante, die man beliebig veredeln kann. Somit hat man den Zugang am Controller konfiguriert, ohne den Code der Actions selbst um Prüfungen zu erweitern. Aber auch innerhalb der Actions kann man das tun, wenn man das unbedingt möchte.
dedlfix.