2009-09-24 9 views
19

En las aplicaciones tradicionales de Web Form de ASP.NET, los UserControls son una gran manera de encapsular la funcionalidad para que pueda ser reutilizada. Sin embargo, los UserControls no encajan bien en el modelo MVC. A menudo hacen un uso intensivo de ViewState y borran la separación de preocupaciones que MVC promueve.¿Cuál es la unidad de reutilización en las aplicaciones .NET MVC?

Mi pregunta es, ¿cuál es el mejor paquete de una funcionalidad para que se pueda compartir en todas las aplicaciones de MVC?

Como ejemplo, considere una desde/hasta la fecha-selector de control de usuario que:

  • permite a un usuario seleccionar dos fechas, ya sea mediante una superposición de Javascript o escribiendo en día, el mes y el año en campos separados
  • pueden ser configurados por defecto a cualquiera de hoy y mañana las fechas o fechas de los desarrolladores elegir
  • valida las fechas que vuelve del usuario para garantizar la de la fecha es antes de la hasta la fecha
  • expone de y a propiedades que pueden ser ac cesado por código detrás

¿Cómo podría construir algo como esto en .NET MVC para poder reutilizarlo fácilmente?

Tenga en cuenta que para emular completamente la funcionalidad de Control de usuario, el componente MVC tendría que gestionar los datos del formulario enviado y la validación, no solo la presentación.

Respuesta

6

En general, estoy de acuerdo en que los controles de usuario son buenos en términos de encapsular cosas de UI, pero no creo que demasiado haya cambiado realmente en MVC. Si recuerdo que reutilizar los controles de usuario en los proyectos clásicos de Asp.net era un problema y nunca fue realmente la mejor manera de crear componentes realmente reutilizables. La mayoría de los juegos de herramientas de interfaz de usuario que compraste para ASP.net clásico no te daban controles de usuario, sino esencialmente controles de servidor y controles de JavaScript.

En su ejemplo, probablemente crearía o encontraría un complemento de jquery (o de su framework de elección) que hiciera lo que deseaba en el lado del cliente. También podrías construir un envoltorio de C# similar al que Telerik hizo con algunos de los controles de la interfaz de usuario de jquery. Creo que la palabra de código subyacente e incluso estado de vista desaparecerán de su vocabulario más se recibe en MVC.

Si mira qué proyectos de código abierto existen para MVC obtendrá su respuesta en términos de lo que debería estar haciendo.

  • La aplicación MVC Contrib añade un montón de características mediante la creación de métodos de extensión y ayudantes.Su control de cuadrícula es una forma típica de crear un componente reutilizable que puede usar en todos los proyectos

  • Telerik, ha creado algunas extensiones que envuelven los controles jquery y administran los activos.

  • Finalmente, creo que si miras hacia el futuro, MVC tiene areas, que si lo interpreto bien te dará la posibilidad de dividir tu proyecto en varios proyectos más pequeños.
+0

En primer lugar, ViewState se puede deshabilitar en formularios web para los controles que no lo usan. Es absolutamente incorrecto decir: "Si recuerdo que reutilizar correctamente los controles de usuario en los proyectos clásicos de Asp.net fue un problema y nunca fue realmente la mejor manera de crear realmente componentes reutilizables". Los controles de usuario son ideales para la reutilización en una sola aplicación frente a los controles de servidor personalizados para su reutilización en múltiples aplicaciones. Los formularios web son GRANDES en lo que respecta a la reutilización, por lo que no deben minimizarse. –

+0

Sin mencionar que a medida que codifica estos componentes reutilizables correctamente, su codificación será más fácil y mucho más rápida a medida que construye su biblioteca (o compre una biblioteca y la amplíe). ¿Soy el único que piensa que la reutilización es un gran problema aquí? Y la gente no debería ir a buscar esta aplicación y esa aplicación ... tenemos que mantener las cosas consistentes y si tienes la mitad de tu sitio en MVC, la mitad en formularios web, más poder para ti y un poco desagradable. –

1

Dos formas en que puedo pensar. Una vista parcial, aunque esto realmente no se transfiere bien desde la aplicación a la aplicación, ya que se mueve alrededor de los archivos ascx. No es un gran dolor, pero no es mi sabor.

Prefiero usar WebControls. Son muy fáciles de usar en mvc y todo lo que necesita hacer es hacer referencia a la biblioteca en el proyecto y posiblemente en su archivo de configuración y listo.

2

Además de lo que ya se ha sugerido, ASP.NET MVC v2 tendrá controles de entrada genéricos con plantilla, consulte here. Usted puede leer cómo otras personas hacer técnicas similares, por ejemplo, here:

Tenemos exactamente 1 llamada de método para generar un elemento forma “Html.InputFor”. Como parte de ese "InputFor", se examina una especificación de entrada, que recopila el PropertyInfo, los atributos, el tipo , los modificadores llamados, y selecciona un InputBuilder apropiado. Call InputFor (p => p.Id) y Id es un GUID? Eso crea un elemento de entrada oculto . Call InputFor (p => p.Customer.Address) and Address es un tipo complejo ? Que busca un parcial con el mismo nombre del tipo de

0

Creo que algunas de las respuestas han perdido la funcionalidad de devolución de datos de los controles. Una forma de manejarlo es pasar cualquier información genérica a través de ViewData al representar su vista parcial. Eso podría publicar nuevamente en su propio control, que a su vez podría redireccionar al UrlReferrer.

Es un poco complicado y el uso de UrlReferrer plantea un riesgo de seguridad. Pero es una solución al problema

+0

Sí, creo que es importante pensar en los datos que regresan del usuario. La aplicación más amplia idealmente no estaría expuesta a cómo ensamblar las fechas a partir de los datos de la publicación. – ctford

2

Habiendo examinado las respuestas votos de los demás, voy a tener un ir en responder a mi propia pregunta.

Me parece que la principal dificultad con la emulación de UserControls en MVC es que cortan a las preocupaciones que tiene como objetivo separar MVC. El seleccionador de fecha/hora UserControl en mi ejemplo incorpora elementos de Model, View, Control e interation. La capacidad de UserControls de agrupar todo esto es exactamente la razón por la que no encajan bien en MVC.

Eso significa que para crear un pseudo-control de usuario en MVC requiere cuatro piezas separadas:

  • Una clase de modelo - en este caso una clase de intervalo o similares
  • Un PartialView que sabe cómo representar el modelo a HTML
  • Un script jQuery para interactividad de capa sobre el HTML de PartialView
  • Un ModelBinder que puede deserializar datos posteriores en una instancia de la clase Model.

El ModelBinder es importante porque trata con los datos que devuelve el usuario. Sin él, todos los Controladores que quisieran mostrar un selector de fecha to/from en cualquiera de sus vistas tendrían que saber cómo ensamblar los seis campos de postdata y cómo lidiar con ellos si no son válidos o si faltan algunos.

0

Como controles de usuario proporcionados en Webforms de ASP.NET, MVC proporciona muchas maneras de hacer que los controles y el código se puedan reutilizar en otra aplicación.

Usando los parciales Si su código parcial tiene algo de lógica C# y renderiza el html usando el código Razor/aspx, entonces es necesario mantenerlos en el archivo razor.

Escriba la funcionalidad de JavaScript como complemento Si mantiene su código y lo escribe mejor, ya que puede usarse en otra aplicación, sería una gran ventaja para usted. La próxima vez, cuando trabaje en otra aplicación, abra esta solución, cópiela y modifíquela. Escriba el código JavaScript que se puede usar como complemento, tal vez tome más lluvia de ideas.

Código Escribir como un # biblioteca independiente C Si algún código es demasiado común para todas las aplicaciones que make.for ejemplo se escribe un sistema de autenticación miembro o alguna función global (C#) que se utilizan en cada aplicación que hace entonces mantener en una solución separada para que pueda usarse en otra aplicación que haya creado cada vez que intente crear una nueva aplicación en el futuro.

Cuestiones relacionadas