2011-01-27 17 views
18

En Web Forms tenemos UserControls. Estos controles tienen un código subyacente y se pueden usar en diferentes proyectos/soluciones que no dependen de otras cosas.UserControl equivalente en MVC3?

Quiero crear un control que represente algunos controles y que tenga algunos enlaces que "activen un evento". Quiero que no se adjunten en mi sitio web, quiero poder usar el mismo "control" en otro sitio web. ¿Cuál es el equivalente en MVC? ¿Es posible compilar una vista con un controlador y usar la DLL en otro lugar?

+0

Relacionado con (pero no un duplicado de) estas preguntas: [73902] (http://stackoverflow.com/questions/73902/ asp-net-mvc-components), [810187] (http://stackoverflow.com/questions/810187/is-there-an-equivalent-to-monorail-view-components-for-the-asp-net-mvc -framework) –

Respuesta

17

El equivalente funcional más cercano a los controles de usuario reutilizables estilo WebForms en MVC son los helpers html. Un helper html es un método que devuelve algo de marcado. Lo que se recomienda es para ponerlos en práctica en forma de métodos de extensión fuera HtmlHelper o alguna otra propiedad de una página MVC:

public static IHtmlString MyControl(this HtmlHelper helper, string value) { 
    return new HtmlString("<p>" + value + "</p>"); 
} 

Puede añadir este método para su proyecto MVC directamente o se puede añadir a una clase separada biblioteca. Lo único que necesita hacer referencia la biblioteca de clases es System.Web.Mvc.dll para la referencia HtmlHelper (también puede necesitar System.Web.dll si usa más tipos).

Por lo general, llamar desde el punto de vista como tal (este ejemplo utiliza la sintaxis Razor que hay de nuevo en MVC 3)

@Html.MyControl("my value") 

Mientras ayudantes superficialmente html emiten marcado como controles de usuario, hay diferencias significativas. El más importante es que las vistas MVC no tienen el concepto del ciclo de vida de la página WebForms. Esto significa que a diferencia de los controles de usuario, los helpers html se procesan en una sola pasada. No hay varias fases como Init, Load, Render, etc. en WebForms donde puede conectar eventos del lado del servidor para interactuar con otros controles en la página.

Dependiendo de los tipos específicos de eventos de los que esté hablando, podría haber técnicas MVC adecuadas para resolver su tarea.¿Podría proporcionar más detalles sobre lo que quiere hacer? Html helpers puede ser bastante poderoso. Por ejemplo, los controles de entrada MVC incorporados como TextBoxFor pueden conectar la validación del lado del cliente, etc.

+0

¿Podría también utilizar una "Vista" regular, representarla como "parcial" y usar un modelo de vista como "código detrás"? Como UserControl es un ASCX, como yo lo veo, el equivalente más cercano es una vista parcial con un ViewModel. –

+1

@rockinthesixstring Los parciales no se ajustan al requisito del OP de que los componentes reutilizables puedan definirse en un ensamblaje separado incluido por algunas aplicaciones diferentes (al menos no sin escribir motores de vista personalizados o proveedores de ruta virtual que carguen vistas desde ensamblajes, etc.) . – marcind

+0

sí, buena llamada. Aunque creo que UserControl es el fraseo equivocado. Tal vez el "control personalizado" es un mejor ajuste? –

3

Dado que los "eventos" no existen en el mismo sentido en MVC que en WebForms, cumplir todos sus requisitos será bastante complicado.

Para la capa de interfaz de usuario del equivalente de UserControl, debe usar una Vista parcial, posiblemente ubicada en la carpeta Vistas/Compartidas/Plantillas, dependiendo de si desea que se asocie o no con cierto tipo de Modelo.

Para el back-end (el "evento"), probablemente deba implementar un Controlador al que pueda enviar las solicitudes desde sus enlaces, y eso admite todo el comportamiento que necesita.

Para utilizar estas funciones en varios proyectos, debe copiar tanto el controlador como la plantilla/vista parcial. Es cierto que puede que no sea tan fácil de reutilizar como un control de usuario de WebForms, pero esa es una limitación que viene con una clara separación de preocupaciones, y eso sería evidente en una capa bien diseñada, basada en capas. Aplicación WebForms también.

actualización en respuesta a un comentario sobre la "limitación" de separación de las preocupaciones que he mencionado:
El controlador puede por supuesto ser distribuidos en un conjunto separado, con su propio conjunto de prueba etc. Sin embargo, incluyendo el controlador ensamblaje (o ensamblajes) y la vista/plantilla parcial con el código frontal es posiblemente una cosa más que hacer (es decir, posiblemente no hacer) que solo copiar un control de usuario con su código subyacente (que se almacena al lado de cada otro).

+0

-1: Iba a votar esto hasta la línea de "separación clara de preocupaciones". ¿Qué pasa con la separación de preocupaciones que impide que un controlador se construya en otro ensamblaje y se haga referencia a él desde muchas aplicaciones MVC? Las vistas son HTML, más o menos, y deberían compartirse como tales, pero ¿por qué no debería todo el código .NET estar en uno o más ensamblajes independientes y comprobables? –

+1

Claro: el controlador definitivamente puede colocarse en un ensamble separado (comprobable) y compartirse independientemente del resto del proyecto. No digo que no sea factible (¡incluso diría que vale la pena el esfuerzo!), Pero definitivamente es más complicado que solo levantar un control de usuario y su archivo de código subyacente (si es que uno lo tiene) de proyecto a proyecto, y solo hace toda la magia por sí mismo. * Eso * está limitado por la clara separación de las preocupaciones, un costo que estoy más que dispuesto a asumir. –