2010-08-04 10 views
8

ACTUALIZACIÓN 2UrlHelper.Action no se asigna a la zona que el controlador está en correctamente

Ok - Así que parece que mi pregunta está cambiando ligeramente de nuevo :-)

me he dado cuenta ahora que UrlHelper.Action no parece resolver correctamente la URL en ningún Área a menos que el nombre del área esté explícitamente especificado. Si no se especifica, parece devolver cualquier nombre de área en el que nos encontremos actualmente, lo que hace que parezca que funciona desde una parte del sitio, pero luego el mismo enlace en otra área se resuelve con el nombre de Área incorrecto.

O he hecho algo funky para que haga esto o no entiendo muy bien cómo funciona este método de Acción.

ACTUALIZA 1

puedo hacer este trabajo de la siguiente manera:

return helper.Action("add", "product",new {area = "storemanagement"}); 

que cambia mi pregunta ligeramente.

¿Cómo es que el enrutamiento MVC no elimina la ambigüedad de los controladores con el mismo nombre y resuelve el que tiene el método de acción especificado?

original era publicar

Hola a todos,

He creado un método de ayuda en la clase UrlHelper y estoy teniendo un pequeño problema con una de las rutas.

Aquí está el código para el método de ayuda en cuestión:

public static string AddProduct(this UrlHelper helper) 
     { 
      return helper.Action("add", "product"); 
     } 

Tengo básicamente dos controladores llamados "producto" que están en diferentes áreas del sitio. Uno de ellos se utiliza para explorar productos y el otro para la gestión de productos. Solo uno de los controladores del producto contiene un método de acción "Agregar".

Cuando la salida que el valor de addProduct

<%: Url.AddProduct() %> 

El nombre del área que se resuelva al área actual que estoy navegando y no el área correcta para el controlador de producto que contiene el método Add acción.

¿Hay algo que necesite configurar en las rutas? No estoy exactamente seguro de cómo funciona la ruta con UrlHelper.Action, así que no sé si es posible hacer lo que estoy intentando.

¡Saludos por cualquier ayuda.

+1

intente agregar el controlador y el área nombre como argumentos adicionales usando este método sig 'UrlHelper.Action Method (String, String, Object)' – Ahmad

+0

Gracias Ahmad. Eso realmente funciona, así que lo agregaré como una actualización de mi pregunta. Todavía estoy interesado en por qué el sistema de enrutamiento no elimina la ambigüedad de los dos controladores y, en su lugar, simplemente parece darse por vencido y asumir el uso del área actual. –

+0

para responder a su pregunta, es necesario profundizar en los aspectos internos del marco MVC para descubrir por qué sucede esto. En cualquier caso, por lo que he visto, solo los valores de ruta 'controlador' y' acción' tienen un tratamiento especial, es decir, el área se infiere/asume en función de desde dónde se llama al ayudante. Por lo tanto, la necesidad de especificar el parámetro de área. – Ahmad

Respuesta

1

Ese es el comportamiento predeterminado del enrutamiento de ASP.NET.

Cuando se encuentra en un "Área", la acción (y la vista) se buscan por el controlador y el nombre de la acción en las ubicaciones predeterminadas. Se presume que la vista es NombreAcción a menos que se indique lo contrario en la acción, p.return PartialView("_MyPartialView.cshtml", ViewModel)

Las ubicaciones predeterminadas son las siguientes: {controlador} = nombre del controlador, {Área} = nombre del área

Controlador:

"Areas/{Area}/{Controller}/" 
"Controllers/{Controller}" 

Vistas:

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/" 
"Views/Shared" 

Si no' Proporcione al Área los valores de ruta que nunca buscará fuera de estas ubicaciones. El área es la misma que la ubicación a la que llamas tu ayudante. Si se encuentra en el directorio raíz (no en un área) que se limitará a

"Controllers/{Controller}" // controller 
"Views/{Controller}/" // views 
"Views/Shared" // views 

El problema fue que cuando se donde en una Area1 se buscó "Areas/Area1/{Controller}/" y cuando estaba en la Area2 se buscó "Areas/Area2/{Controller}/" (Y ambos buscaron el Controllers/Product y Controllers/Shared). Pudo encontrarlo cuando estaba en el área correcta porque encajaba en la ubicación de búsqueda predeterminada, pero no mientras estaba en la otra área porque el controlador estaba solo en el área física.

Agregando el Área como lo hizo, le dice que busque en un Área predefinida para que vaya directamente allí. "Areas/Storemanagement/Views/product/" y busque la vista definida en Agregar acción.

No tiene mucho sentido que un método de ayuda vacío devuelva un método Url.Action, pero tal vez sea solo para demostración.

(Acabo de notar que la pregunta es bastante antiguo pero supongo que esto puede estar aquí para referencia futura)

1

Sólo para poner la respuesta en la sección de respuestas para mayor claridad ...

Tendrá para agregar Area al RouteValues cada vez que use UrlHelper.Action para generar una ruta de enlace.

Si usted está en el controlador, puede stub a UrlHelper así:

var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); 
var requestContext = new RequestContext(httpContext, new RouteData()); 
var urlHelper = new UrlHelper(requestContext); 

Siempre se puede get the current area así:

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"] 

Por último, cuando se utiliza UrlHelperpass the area in the RouteValues object así:

var url = urlHelper.Action("Index", "Home", new { area = "Pages" })); 
Cuestiones relacionadas