2009-09-13 21 views
39

¿Cómo puedo acceder a una instancia de controlador desde la vista? P.ej. Tengo un HomeController que luego devuelve mi vista Index. Dentro de esa vista quiero acceder a la instancia HomeController que creó la vista. ¿Cómo puedo hacer eso?ASP.NET MVC: Instancia de controlador de acceso de la vista

+0

¿Cómo es que la respuesta a esto no es "no se supone que debes hacerlo" (c.f. https://stackoverflow.com/q/9562214/1739000)? –

Respuesta

70

ViewContext.Controller, y tendrá que echarlo.

<% var homeController = ViewContext.Controller as HomeController; %> 

Esto se cubre con unas cuantas arrugas adicionales en la post Asp.Net MVC: How do I get virtual url for the current controller/view?.

EDIT: Esto es para agregar un poco de carne a la recomendación de Mark Seemann de que mantenga la funcionalidad fuera de la vista tanto como sea humanamente posible. Si está utilizando el controlador para ayudar a determinar el marcado de la página representada, le conviene usar el método Html.RenderAction(actionName, controllerName). Esta llamada activará la acción como si fuera una solicitud separada e incluirá su vista como parte de la página principal.

Este enfoque ayudará a imponer la separación de preocupaciones porque el método de acción redirigido a puede hacer todo el trabajo pesado con respecto a las reglas de presentación. Tendrá que devolver una Vista parcial para que funcione correctamente dentro de su vista principal.

+0

Eso es lo que estaba buscando. Gracias David – Alex

+0

@Alex: contento de ayudar –

+0

@David: RenderAction solo está disponible en el paquete Futures, ¿es correcto? – Alex

28

En mi opinión, debe considerar un diseño donde la vista no necesita saber sobre el controlador. La idea es que el Controlador maneje la solicitud, conjure un Modelo y lo transfiera a la Vista. En ese punto, el trabajo del Controlador está hecho.

Creo que es una indicación de un defecto de diseño si la Vista necesita saber algo sobre el Controlador. ¿Puedes compartir más sobre qué es lo que estás tratando de lograr?

A menudo me parece que cuando se trata de marcos bien diseñados (como el marco MVC), si se siente como que el marco está luchando contra ti, probablemente estés haciendo la tarea de la manera incorrecta. Esto me ha pasado mucho, y dar un paso atrás y preguntarme qué es lo que realmente estoy tratando de lograr a menudo me lleva a nuevas ideas.

+1

+1 para eso. Si se necesitan clases de utilidad, generalmente deben ir al ViewModel o a una entidad completamente separada, ya que el ciclo de vida de los controladores debe terminar con el "retorno". –

+0

Marca: He añadido un poco más a tu argumento en mi propia publicación. +1 –

+0

+1 de mí también. Pensé acerca de esto. Lo que estoy haciendo es que tengo una vista parcial, similar a LogOnUserControl del proyecto de inicio regular para ASP.NET MVC. Muestra un nombre de usuario (pero no proviene del contexto de página/IPrincipal, es personalizado). Mi controlador ya tiene un servicio que es capaz de proporcionar el nombre de usuario, por lo que preferiría tomar la instancia del controlador en lugar de volver a crear una instancia en la vista.No estoy usando el modelo porque me gustaría aprovechar el retorno regular View() y no tener problemas (recuerde, esto es compartido, así que necesitaría una clase base VM, etc. – Alex

Cuestiones relacionadas