2010-12-11 6 views
6

J'ai une classe utilisée par les contrôleurs de [Project] .Controllers et par des contrôleurs dans différentes zones. Comment pourrais-je déterminer où se trouve le contrôleur? (Je suppose que je pourrais regarder les propriétés de HttpContext.Current.Request -mais je suis à la recherche d'un moyen "correct" MVC). Je vous remercie.Comment obtenir la zone d'exécution en cours?

C'est:

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

Répondre

16

Nous avons délibérément pas exposé un moyen d'obtenir le nom de zone actuel à partir d'une demande MVC depuis "un rea "est simplement un attribut d'un itinéraire. Ce n'est pas fiable pour d'autres utilisations. En particulier, si vous voulez que vos contrôleurs aient un attribut (pensez au terme abstrait, pas à la classe System.Attribute) qui peut être utilisé par l'assistant, alors ces attributs doivent être trouvés sur les contrôleurs eux-mêmes, pas sur la zone.

Par exemple, si vous voulez exécuter une logique (comme un filtre d'action) avant tout contrôleur dans une zone particulière, doit associer directement le filtre d'action à ces contrôleurs. La façon la plus simple d'y parvenir est d'attribuer MyAreaBaseController à ce filtre, puis d'avoir chaque contrôleur que vous voulez logiquement associer à cette zone pour sous-classer ce type. Toute autre utilisation, telle qu'un filtre global qui examine RouteData.DataTokens ["area"] pour prendre une décision, n'est pas prise en charge et potentiellement dangereuse.

Si vous avez vraiment besoin du nom de zone actuel, vous pouvez utiliser RouteData.DataTokens["area"] pour le trouver.

+0

Salut Levi c'était une bonne réponse merci. –

+1

C'est génial d'avoir des nouvelles de l'équipe .NET à ce sujet. Est-ce que votre réponse s'applique à l'intérieur d'une vue? J'ai une vue partagée qui est utilisée dans différents domaines, et je voudrais changer son apparence en fonction de l'emplacement de l'utilisateur sur le site. Je pourrais utiliser une vue partielle, mais la vue principale serait presque vide. Mettre quelque chose dans le ViewBag semble faux, car c'est strictement une logique de présentation. –

4

Vous devriez être en mesure d'obtenir la chaîne de la zone de RouteData:

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

.. vous pouvez donc faire une méthode d'extension pour les aides comme ceci:

public static class SomeHelper // in [Project].Helpers 
{ 
    public static string Area(this HtmlHelper helper) 
    { 
     return (string)helper.ViewContext.RouteData.DataTokens["area"]; 
    } 
} 
Questions connexes