2010-12-11 8 views
6

Tengo una clase utilizada por los controladores en [Proyecto] .Controladores y por controladores en diferentes áreas. ¿Cómo podría determinar dónde está el controlador? (Creo que podría ver las propiedades de HttpContext.Current.Request, pero estoy buscando una forma MVC "adecuada"). Gracias.¿Cómo obtener el área de ejecución actual?

Eso es:

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

Respuesta

16

A propósito no mostramos una forma de obtener el nombre de área actual de una solicitud de MVC ya que "a rea "es simplemente un atributo de una ruta. No es confiable para otros usos. En particular, si desea que sus controladores tengan algún atributo (piense en el término abstracto, no en la clase System.Attribute) que puede usar el helper, entonces esos atributos se deben encontrar en los controladores, , no en el área.

Como ejemplo práctico, si quiere un poco de lógica (como un filtro de acción) para ejecutar antes que cualquier controlador en un área particular, debe asociar el filtro de acción con esos controladores directamente. La forma más sencilla de hacer esto es atribuir algo de MyAreaBaseController con ese filtro, y luego hacer que cada controlador que lógicamente desee asociar con esa área sea una subclase de ese tipo. Cualquier otro uso, como un filtro global que examine RouteData.DataTokens ["área"] para tomar una decisión, no es compatible y es potencialmente peligroso.

Si realmente necesita obtener el nombre del área actual, puede usar RouteData.DataTokens["area"] para encontrarlo.

+0

Hola Levi que fue una gran respuesta, gracias. –

+1

Es genial escuchar al equipo de .NET al respecto. ¿Su respuesta se aplica cuando está dentro de una vista? Tengo una vista compartida que se usa en diferentes áreas, y me gustaría cambiar su apariencia en función de dónde se encuentre el usuario en el sitio. Podría usar una vista parcial, pero luego la vista principal estaría casi vacía. Poner algo en el ViewBag parece incorrecto porque es estrictamente lógica de presentación. –

4

Usted debe ser capaz de obtener la cadena área de RouteData:

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

.. para que pueda hacer un método de extensión para los ayudantes como este:

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