2011-01-07 2 views
1

J'utilise une vue partielle sur deux pages distinctes et la vue partielle utilise des métadonnées pour obtenir les noms d'affichage sous la forme d'attributs sur le modèle (la façon standard de faire des métadonnées).MVC2 trouver zone/contrôleur/action depuis l'attribut personnalisé

Je dois rendre le nom d'affichage sensible au contexte en fonction de la page. Pour cela, j'étend le System.ComponentModel.DisplayNameAttribute et je passe dans un tableau de zone/controller/action/resourcefile/resourcestring pour que je puisse choisir la chaîne de ressources correcte en fonction du contexte.

Mon problème est de savoir comment puis-je obtenir la zone/contrôleur/action à partir de ce qui suit:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using CommonInterfaces.Helpers; 

namespace CommonInterfaces.ComponentModel 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
    public class ContextSensitiveDisplayName : System.ComponentModel.DisplayNameAttribute 
    { 
     public class Context 
     { 
      public string Area { get; set; } 
      public string Controller { get; set; } 
      public string Action { get; set; } 
      public Type ResourceType { get; set; } 
      public string ResourceKey { get; set; } 

      public Context(string area, string controller, string action, Type resourceType, string resourceKey) 
      { 
       this.Area = area; 
       this.Controller = controller; 
       this.Action = action; 
       this.ResourceType = resourceType; 
       this.ResourceKey = resourceKey; 
      } 
     } 

     public ContextSensitiveDisplayName(params Context[] contexts) 
     { 
      /* Its these values that I need */ 
      string currentArea = ""; 
      string currentController = ""; 
      string currentAction = ""; 

      Context selectedContext = 
       contexts.FirstOrDefault(m => 
        (m.Area == currentArea) && 
        (m.Controller == currentController) && 
        (m.Action == currentAction) 
       ); 

      this.DisplayNameValue = ""; // Use the selectContext to retrieve string from resource file. 
     } 
    } 
} 

Toute aide à ce serait grandement apprécié.

Répondre

1

J'ai utilisé ce à la fin.

var routingValues = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)).Values; 
    string currentArea = (string)routingValues["area"] ?? string.Empty; 
    string currentController = (string)routingValues["controller"] ?? string.Empty; 
    string currentAction = (string)routingValues["action"] ?? string.Empty; 

Je vais essayer la réponse de Jakub Konecki avant que marque sur le bon - son apparence un peu plus robuste avec les chèques nuls et tous. Je vais m'en occuper bientôt.

-1

Ce n'est pas le cas. Les instances d'attribut ne sont pas créées dans un contexte qui connaît la route. Vous ne pouvez pas faire cela dans un attribut.

n'est cette information transmise au fournisseur de métadonnées par DefaultModelBinder, écrit donc un fournisseur de métadonnées personnalisées ne sera pas utile à moins que vous aussi écrire un liant modèle personnalisé. Ce qui est trop de travail à mon humble avis.

Je suggère d'utiliser différents modèles de vue.

+0

Je l'ai marqué parce que vous pouvez obtenir les informations de routage assez facilement. –

1

Il est un peu méchant mais devrait fonctionner:

if(HttpContext.Current != null && HttpContext.Current.Handler is System.Web.Mvc.MvcHandler) 
{ 
    var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler; 
    var controller = handler.RequestContext.RouteData.Values["controller"]; 
    var action = handler.RequestContext.RouteData.Values["action"]; 
} 
+0

Eh bien, je suis d'accord avec la partie "méchante". :) –

Questions connexes