2010-12-11 7 views
6

Ich habe eine Klasse, die von Controllern bei [Project] .Controllern und von Controllern in verschiedenen Bereichen verwendet wird. Wie kann ich feststellen, wo der Controller ist? (Ich denke, ich könnte mir die Eigenschaften von HttpContext.Current.Request ansehen - aber ich suche nach einer "richtigen" MVC-Methode). Vielen Dank.Wie bekomme ich den aktuell ausgeführten Bereich?

Das heißt:

[Project].Helpers // called by: 
[Project].Controllers 
[Project].Areas.[Area].Controllers 
// how could I determine the caller from [Project].Helpers? 

Antwort

16

Wir haben absichtlich keinen Weg gefunden, um den aktuellen Gebietsnamen von einer MVC-Anfrage zu erhalten, da "a rea "ist einfach ein Attribut einer Route. Es ist unzuverlässig für andere Anwendungen. Insbesondere wenn Sie möchten, dass Ihre Controller über ein Attribut verfügen (denken Sie an den abstrakten Begriff, nicht an die System.Attribute-Klasse), der vom Helper verwendet werden kann, müssen diese Attribute auf den Controllern selbst gefunden werden, nicht im Bereich.

Wenn Sie möchten, dass eine Logik (wie ein Aktionsfilter) vor irgendwelchen Controllern in einem bestimmten Bereich ausgeführt wird, müssen Sie den Aktionsfilter diesen Controllern direkt zuordnen. Der einfachste Weg, dies zu tun, besteht darin, einige MyAreaBaseController mit diesem Filter zu versehen und dann jeden Controller, den Sie logisch diesem Bereich zuordnen möchten, diesem Typ unterzuordnen. Jede andere Verwendung, z. B. ein globaler Filter, der RouteData.DataTokens ["Bereich"] betrachtet, um eine Entscheidung zu treffen, wird nicht unterstützt und ist möglicherweise gefährlich.

Wenn Sie wirklich, wirklich brauchen, um den aktuellen Gebietsnamen zu erhalten, können Sie RouteData.DataTokens["area"] verwenden, um es zu finden.

+0

Hallo Levi, das war eine großartige Antwort, danke. –

+1

Es ist großartig, von dem .NET-Team zu hören. Gilt Ihre Antwort in einer Ansicht? Ich habe eine gemeinsame Ansicht, die in verschiedenen Bereichen verwendet wird, und ich möchte die Darstellung basierend darauf ändern, wo sich der Benutzer auf der Website befindet. Ich könnte eine Teilansicht verwenden, aber dann wäre die Hauptansicht fast leer. Etwas in den ViewBag zu schreiben, scheint falsch zu sein, da es sich um eine reine Präsentationslogik handelt. –

4

Sie sollten den Bereich Zeichenfolge von RouteData bekommen können:

// action inside a controller in an area 
public ActionResult Index() 
{ 
    var area = RouteData.DataTokens["area"]; 
    .... 
    return View(); 
} 

.. so können Sie machen eine Erweiterungsmethode für Helfer wie folgt aus:

Verwandte Themen