2009-10-29 18 views
5

Estoy disfrutando de Asp.Net MVC y estoy buscando utilizarlo en un próximo proyecto. Parte del proyecto, sin embargo, es un énfasis en la posibilidad de exponer las Vistas del proyecto a los diseñadores para cosas como la temática, etc. Un problema que anticipo es que las vistas de Asp.Net MVC están más bien centradas en el desarrollador. Realmente no quiero tener que educar a los diseñadores de las intracies de <% vs. <% = mucho menos algo así como <% foreach ...Vistas de diseño amigable en Asp.Net MVC

Tome una estructura de menú típico MVC, por ejemplo.

<div id="menu"> 
<ul> 
     <li><%= Html.ActionLink("Home", "Index", "Main")%></li> 
     <li><%= Html.ActionLink("About", "About", "Main")%></li> 
     <li><% Html.RenderPartial("LogOnUserControl"); %></li> 
    </ul> 
</div> 

Prefiero ser capaz de decirle a los diseñadores para ir con algo como

<div id="menu"> 
<ul> 
     <li>{ActionLink "Home", "Index", "Main"}</li> 
     <li>{ActionLink "About", "About", "Main"}</li> 
     <li>{Partial "LogOnUserControl"}</li> 
    </ul> 
</div> 

O

<div id="menu"> 
<ul> 
     <li><my:ActionLink text="Home" action="Index" controller="Main" /></li> 
     <li><my:ActionLink text="About" action="About" controller="Main" /></li> 
     <li><my:Partial name="LogOnUserControl" /></li> 
    </ul> 
</div> 

Sí, que los últimos se parece sospechosamente a una serie de UserControls. Personalmente, no soy fanático de usar UserControls para hacer esto solo porque la representación de esos controles sucede después de casi todo lo demás (según entiendo) y prefiero algo que encaje más con el ciclo de vida de MVC. . Todo lo que realmente necesito es un conjunto de marcadores de posición y una forma de reemplazarlos con la representación relevante.

Entonces, ¿cuál es el mejor lugar para hacerlo y qué tipo de concesiones estoy viendo aquí. Me puedo imaginar un par de ángulos para llegar a esto:

  • Una clase de página de visualización personalizada donde puedo anular algo relevante. ViewPage.RenderView o ViewPage.FrameworkInitialize, tal vez, pero cómo se llega al texto desde allí no lo sé.
  • Crea un TextWriter personalizado y reemplaza a ViewPage.CreateHtmlTextWriter que luego puedo interceptar la salida de texto para reemplazar cosas. Esto es bastante tarde en el ciclo, sin embargo, y se mezclará con otros filtros personalizados si no tengo cuidado.
  • Crea mis propias clases IView y ViewEngine. No llegué muy lejos en este camino antes de preguntarme si me dirigía a un lugar muy malo.
  • Usuario personalizadoControles que pueden imitar la funcionalidad necesaria.

Opiniones? ¿Otras opciones? ¿Mi ViewEngine es mi mejor opción? Mi propia ViewPage? ¿O los objetos de UserControl van a ser adecuados (por favor diga que no)?

+1

Sus diseñadores front-end deben estar bien con la sintaxis predeterminada. No pondría demasiado esfuerzo en esto. De cualquier manera, MVC es una gran mejora para sus necesidades de todos modos. ;) –

+0

No crearía nada solo para sus diseñadores. Entrenarlos en la sintaxis y seguir adelante. De lo contrario, estarás atascado manteniendo tu sabor de ViewEngine. Cuando salen nuevas versiones, puede haber cambios bruscos ... –

+0

Quiero la menor fricción posible para los diseñadores. "Mejor de lo que están acostumbrados" no es lo suficientemente bueno. Estoy bien lidiando con los cambios de última hora en caso de que ocurran. Si esto se hace bien (es decir, centralizado en algo que se modifique fácilmente), es preferible un poco de mejora de la actualización al reentrenamiento del diseñador. –

Respuesta

5

Eche un vistazo a Spark. Su sintaxis es similar a tu ejemplo.

+1

+1 para Spark, pero tus diseñadores todavía no pueden estar despistados. – mxmissile

+0

chispa parece una manipulación extraña de HTML y lógica de fondo. –

+0

No quiero diseñadores desorientados. Simplemente no quiero obligarlos a aprender a desarrollar mientras están en eso. –

1

Como dijo Charles Conway, Spark definitivamente es el camino a seguir. Mira el ejemplo. En primer lugar, se crea vista parcial en _ActionLink.spark con código:

<viewdata text="String" action="String" controller="String"> 
${ Html.ActionLink(controller, action, text) } 

Entonces que lo utilice como que en otros puntos de vista:

<ActionLink text="Home" action="Index" controller="Main" /> 

Sólo hay que preparar vistas parciales para sus diseñadores y entonces una vista de creación en el estilo preferido. ¿No es fácil?

EDIT:

Lo sentimos, que estaba equivocado.<ActionLink text="Home" action="Index" controller="Main" /> no funcionará, porque Inicio, Índice y Principal son tratados como variables. Puede que no sea tan fácil hacerlo como lo desees.

+0

funcionará. No son variables, son código C#. – queen3

+0

Quería encontrar una solución que no requiriera el uso de comillas dobles, porque no es demasiado intuitiva. – LukLed

0

Mientras respondido y aceptado, no veo el ejemplo de esto: ¿por qué no sólo tiene que utilizar:

<li><a href='<%= Url.Action("Home", "Index")%>'>Main</a></li>

similares en el Spark. Prefiero esto a Html.ActionLink, Html.BeginForm, etc., siempre que sea posible (casi siempre, excepto para los controles de formulario, donde es más fácil tener codificación de nombre automática con Html helpers).

Y sus diseñadores hacen ver el enlace.

+0

La diferencia entre Url.Action y Html.ActionLink es de gusto, creo. Cualquiera de los dos requerirá que los diseñadores aprendan una API de programación y ninguno resuelve el problema adicional de Html.RenderPartial y aprende la diferencia entre <% y <% = (y errores donde se agrega o se deja el;). Para mis propósitos, esto es funcionalmente equivalente a lo que quiero evitar. –

1

Tengo un requisito similar para un proyecto actual, excepto que mis 'diseñadores' son más o menos usuarios finales (gente que conoce bien el html, pero no es su trabajo) lo que lleva a algunos desafíos adicionales. Mi implementación es probablemente demasiado específica para sus necesidades, pero la explicaré rápidamente para que no sea útil para nadie más.

Quería evitar totalmente cualquier tipo de código en las vistas de las páginas que diseñarían, así que decidí ir con un sistema de plantillas que hace algo similar a su punto 2, pero no en tiempo de ejecución. También estoy usando chispa, aunque no es para el beneficio de los usuarios, ya que no tocarán nada que se parezca al código.

Básicamente, los usuarios crean una plantilla completa de solo html que tiene etiquetas de marcador de posición para controles de usuario y vistas parciales. Los usuarios luego cargan la plantilla a través de una interfaz que la analiza y la convierte en una vista de chispa.

por ejemplo. Para obtener una galería de imágenes, <gallery /> se analiza en algo como !{Html.Gallery(Model)} o <use file="Gallery"/>. Para un campo de descripción, <desc name="Kitchen" /> se analiza en !{Html.Description(Model, x => x.Descriptions.Kitchen)}. También comprueba que "Cocina" es, de hecho, una propiedad del objeto/página que se está modelando, o que el Modelo que se transfiere a una galería en realidad contiene una colección de imágenes para evitar errores de tiempo de ejecución.

Se pueden especificar otras propiedades en la etiqueta para pasar parámetros adicionales a los controles analizados. Si el control especificado requiere Javascript, entonces también se incluye en la vista. Si hay algún problema de análisis, la salida devuelve la especificación de qué marcador de posición no es válido y por qué.

+0

No es una mala idea. Supongo que podría poner su intérprete en el ciclo de vida de la página de tiempo de ejecución, pero dado que se trata de un proceso unidireccional y de una sola vez, es probable que sea mejor tener un paso adicional para la implementación. –

Cuestiones relacionadas