UPDATE 2
Ok - Es sieht also so aus, als ob sich meine Frage wieder etwas ändert: -)
Ich habe jetzt erkannt, dass URLHelper.Action die URL in keinem Bereich korrekt aufzulösen scheint, es sei denn, der Bereichsname ist explizit angegeben. Wenn es nicht angegeben wird, scheint es den Namen des Gebiets, in dem wir uns gerade befinden, zurückzugeben, was es so aussehen lässt, als würde es von einem Teil der Seite funktionieren, aber derselbe Link in einem anderen Bereich wird in den falschen Gebietsnamen aufgelöst.
Entweder habe ich etwas Unkonventionelles getan, um es zu tun, oder ich verstehe nicht ganz, wie diese Aktionsmethode funktionieren soll.
UPDATE 1
Ich kann das folgendermaßen machen:
%Vor%was meine Frage etwas ändert.
Wie kommt es, dass das MVC-Routing die Controller mit dem gleichen Namen nicht disambiguiert und zu dem mit der angegebenen Action-Methode auflöst?
Originaler Beitrag
Hey alle zusammen,
Ich habe eine Hilfsmethode für die UrlHelper-Klasse erstellt und habe ein kleines Problem mit einer der Routen.
Hier ist der Code für die fragliche Hilfsmethode:
%Vor%Ich habe grundsätzlich zwei Controller namens "product", die sich in verschiedenen Bereichen der Site befinden. Einer von ihnen dient zum Durchsuchen von Produkten und der andere zum Verwalten von Produkten. Nur einer der Produktcontroller enthält eine Aktionsmethode "Hinzufügen".
Wenn ich den Wert von AddProduct
ausgabe %Vor%Der Bereichsname wird in den aktuellen Bereich aufgelöst, den ich durchsuche, und nicht auf den korrekten Bereich für den Produktcontroller, der die Aktionsmethode Add enthält.
Gibt es etwas, das ich in den Routen einrichten muss? Ich bin nicht genau sicher, wie das Routing mit UrlHelper.Action funktioniert, also weiß ich nicht, ob es möglich ist, zu tun, was ich versuche.
Prost für jede Hilfe.
Das ist das Standardverhalten von ASP.NET Routing.
Wenn in einem "Bereich" die Aktion (und die Ansicht) nach Controller und Aktionsname an Standardspeicherorten gesucht wird.
Die Ansicht wird als ActionName angenommen, sofern in der Aktion nicht anders angegeben, z. return PartialView("_MyPartialView.cshtml", ViewModel)
Die Standardspeicherorte sind: {Controller} = Controllername, {Area} = Bereichsname
Controller:
%Vor%Ansichten:
%Vor%Wenn Sie den Bereich nicht in den Routenwerten angeben, wird er nie außerhalb dieser Orte suchen. Der Bereich ist derselbe wie der Ort, an dem Sie Ihren Helfer anrufen. Wenn Sie sich auf der Stammebene befinden (nicht in einem Bereich), ist sie auf
beschränkt %Vor% Das Problem war, dass wenn Sie in einem Area1 gesucht haben
"Areas/Area1/{Controller}/"
und wenn du in Area2 warst, hat es "Areas/Area2/{Controller}/"
durchsucht (und beide haben die Controllers/Product
und Controllers/Shared
durchsucht). Es war in der Lage, es zu finden, wenn Sie in der richtigen Gegend waren, weil es den Standardsuchort passte, aber nicht während in dem anderen Bereich, weil der Controller nur in dem einen physischen Bereich war.
Wenn Sie den Bereich wie gewohnt hinzufügen, wird er aufgefordert, in einem vordefinierten Bereich zu suchen, damit er direkt dorthin gelangt.
"Areas/Storemanagement/Views/product/"
und suchen Sie nach der in der Aktion zum Hinzufügen definierten Ansicht.
Es hat wenig Sinn, eine leere Hilfsmethode zu verwenden, die eine Url.Action-Methode zurückgibt, aber das war vielleicht nur eine Demonstration.
(Ich habe gerade bemerkt, dass die Frage ziemlich alt ist, aber ich denke, das kann hier für zukünftige Referenz sein)
Nur um die Antwort in die Antwort-Sektion für Klarheit zu legen ...
Wenn Sie Area
verwenden, müssen Sie RouteValues
zu UrlHelper.Action
hinzufügen, um einen Linkpfad zu generieren.
Wenn Sie im Controller sind, können Sie einen UrlHelper so stubben:
%Vor%Sie können immer den aktuellen Bereich so erhalten:
%Vor% Wenn Sie UrlHelper
verwenden, übergeben Sie den Bereich im RouteValues-Objekt wie folgt:
Tags und Links c# asp.net asp.net-mvc-2 asp.net-mvc-routing