Pregunta

He estado buscando en SO y Google un desglose de los distintos motores de visualización disponibles para ASP.NET MVC, pero no he encontrado mucho más que simples descripciones de alto nivel de lo que es un motor de visualización.

No estoy necesariamente buscando "mejor" o "más rápido", sino más bien algunas comparaciones del mundo real de las ventajas/desventajas de los principales actores (por ejemplo,el WebFormViewEngine predeterminado, MvcContrib View Engines, etc.) para diversas situaciones.Creo que esto sería realmente útil para determinar si cambiar del motor predeterminado sería ventajoso para un proyecto o grupo de desarrollo determinado.

¿Alguien ha encontrado tal comparación?

¿Fue útil?

Solución

Motores de visualización ASP.NET MVC (Wiki de la comunidad)

Dado que no parece existir una lista completa, comencemos una aquí en SO.Esto puede ser de gran valor para la comunidad ASP.NET MVC si las personas agregan su experiencia (especialmente.cualquiera que haya contribuido a uno de estos).Cualquier cosa que implemente IViewEngine (p.ej. VirtualPathProviderViewEngine) es un juego limpio aquí.Simplemente ordene alfabéticamente los nuevos View Engines (dejando WebFormViewEngine y Razor en la parte superior) y trate de ser objetivo en las comparaciones.


System.Web.Mvc.WebFormViewEngine

Objetivos de diseño:

Un motor de vista que se utiliza para representar una página de formularios web a la respuesta.

Ventajas:

  • omnipresente ya que viene con ASP.NET MVC
  • experiencia familiar para desarrolladores de ASP.NET
  • IntelliSense
  • Puede elegir cualquier idioma con un proveedor de CodeDom (p. ej.C#, VB.NET, F#, Boo, Nemerle)
  • compilación bajo demanda o precompilado puntos de vista

Contras:

  • El uso se confunde con la existencia de patrones "ASP.NET clásicos" que ya no se aplican en MVC (p. ej.Ver publicación de estado atrás)
  • puede contribuir al antipatrón de la "sopa de etiquetas"
  • la sintaxis del bloque de código y la escritura segura pueden interponerse en el camino
  • IntelliSense impone un estilo que no siempre es apropiado para los bloques de código en línea
  • puede ser ruidoso al diseñar plantillas simples

Ejemplo:

<%@ Control Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %>
<% if(model.Any()) { %>
<ul>
    <% foreach(var p in model){%>
    <li><%=p.Name%></li>
    <%}%>
</ul>
<%}else{%>
    <p>No products available</p>
<%}%>

Sistema.Web.Razor

Objetivos de diseño:

Ventajas:

  • Compacto, expresivo y fluido
  • Fácil de aprender
  • no es un idioma nuevo
  • Tiene un gran Intellisense
  • Unidad comprobable
  • Ubicuo, viene con ASP.NET MVC

Contras:

  • Crea un problema ligeramente diferente al de la "sopa de etiquetas" mencionada anteriormente.Mientras que las etiquetas del servidor en realidad proporcionan una estructura en torno al código del servidor y no del servidor, Razor confunde HTML y código de servidor, lo que hace que el desarrollo de HTML puro o JS sea un desafío (consulte el Ejemplo #1), ya que termina teniendo que "escapar" de HTML y/o JavaScript. etiquetas bajo ciertas condiciones muy comunes.
  • Mala encapsulación+reutilizabilidad:No es práctico llamar a una plantilla de razor como si fuera un método normal; en la práctica, razor puede llamar a código pero no al revés, lo que puede fomentar la combinación de código y presentación.
  • La sintaxis está muy orientada a html;generar contenido que no sea HTML puede ser complicado.A pesar de esto, el modelo de datos de Razor es esencialmente solo una concatenación de cadenas, por lo que los errores de sintaxis y anidamiento no se detectan estática ni dinámicamente, aunque la ayuda en tiempo de diseño de VS.NET mitiga esto de alguna manera.La mantenibilidad y la refactorabilidad pueden verse afectadas debido a esto.
  • Sin API documentada, http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Ejemplo de estafa n.º 1 (observe la ubicación de "cadena[]..."):

@{
    <h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

Bellevue

Objetivos de diseño:

  • Respete HTML como lenguaje de primera clase en lugar de tratarlo como "solo texto".
  • ¡No te metas con mi HTML!El código de enlace de datos (código Bellevue) debe estar separado del HTML.
  • Aplicar una separación estricta entre modelo y vista

Candaliza

Objetivos de diseño:

El motor Brail View se ha portado desde monorail para trabajar con el marco MVC Microsoft ASP.NET MVC.Para una introducción a Brail, consulte la documentación sobre el Sitio web del Proyecto Castle.

Ventajas:

  • modelado a partir de la "sintaxis de Python compatible con la muñeca"
  • Vistas compiladas bajo demanda (pero no hay precompilación disponible)

Contras:

  • diseñado para ser escrito en el idioma Abucheo

Ejemplo:

<html>    
<head>        
<title>${title}</title>
</head>    
<body>        
     <p>The following items are in the list:</p>  
     <ul><%for element in list:    output "<li>${element}</li>"%></ul>
     <p>I hope that you would like Brail</p>    
</body>
</html>

hásico

Hasic utiliza literales XML de VB.NET en lugar de cadenas como la mayoría de los otros motores de visualización.

Ventajas:

  • Comprobación en tiempo de compilación de XML válido
  • Coloración de sintaxis
  • inteligencia completa
  • Vistas compiladas
  • Extensibilidad mediante clases, funciones, etc. de CLR habituales.
  • Componibilidad y manipulación perfectas ya que es código VB.NET normal.
  • Unidad comprobable

Contras:

  • Actuación:Construye todo el DOM antes de enviarlo al cliente.

Ejemplo:

Protected Overrides Function Body() As XElement
    Return _
    <body>
        <h1>Hello, World</h1>
    </body>
End Function

ndjango

Objetivos de diseño:

NDjango es una implementación del Lenguaje de plantilla Django en la plataforma .net, utilizando el lenguaje F#.

Ventajas:


NHaml

Objetivos de diseño:

Puerto .NET del motor de visualización Rails Haml.De el sitio web de Haml:

Haml es un lenguaje de marcado que se usa para describir limpiamente y simplemente describir el XHTML de cualquier documento web, sin el uso de código en línea ...Haml evita la necesidad de codificar explícitamente XHTML en la plantilla, porque en realidad es una descripción abstracta del XHTML, con algún código para generar contenido dinámico.

Ventajas:

  • estructura concisa (es decir,SECO.)
  • bien sangrado
  • estructura clara
  • C# Intellisense (para VS2008 sin ReSharper)

Contras:

  • una abstracción de XHTML en lugar de aprovechar la familiaridad del marcado
  • Sin Intellisense para VS2010

Ejemplo:

@type=IEnumerable<Product>
- if(model.Any())
  %ul
    - foreach (var p in model)
      %li= p.Name
- else
  %p No products available

NVelocityViewEngine (MvcContrib)

Objetivos de diseño:

Un motor de visualización basado en NVelocidad que es un puerto .NET del popular proyecto Java Velocidad.

Ventajas:

  • fácil de leer/escribir
  • código de vista conciso

Contras:

  • número limitado de métodos de ayuda disponibles en la vista
  • no tiene automáticamente integración con Visual Studio (IntelliSense, verificación de vistas en tiempo de compilación o refactorización)

Ejemplo:

#foreach ($p in $viewdata.Model)
#beforeall
    <ul>
#each
    <li>$p.Name</li>
#afterall
    </ul>
#nodata 
    <p>No products available</p>
#end

Azulejos afilados

Objetivos de diseño:

SharpTiles es un puerto parcial de JSTLcombinado con el concepto detrás del Marco de azulejos (a partir del hito 1).

Ventajas:

  • familiar para los desarrolladores de Java
  • Bloques de código de estilo XML

Contras:

  • ...

Ejemplo:

<c:if test="${not fn:empty(Page.Tiles)}">
  <p class="note">
    <fmt:message key="page.tilesSupport"/>
  </p>
</c:if>

Motor de vista Spark

Objetivos de diseño:

La idea es permitir que el HTML domine el flujo y el código se ajuste a la perfección.

Ventajas:

Contras:

  • No hay una separación clara entre la lógica de la plantilla y el marcado literal (esto puede mitigarse mediante prefijos de espacios de nombres)

Ejemplo:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
    <li each="var p in products">${p.Name}</li>
</ul>
<else>
    <p>No products available</p>
</else>

<Form style="background-color:olive;">
    <Label For="username" />
    <TextBox For="username" />
    <ValidationMessage For="username" Message="Please type a valid username." />
</Form>

StringTemplate Ver motor MVC

Objetivos de diseño:

  • Ligero.No se crean clases de página.
  • Rápido.Las plantillas se escriben en el flujo de salida de respuesta.
  • En caché.Las plantillas se almacenan en caché, pero utilizan un sistema de sistema de archivos para detectar los cambios de archivo.
  • Dinámica.Las plantillas se pueden generar sobre la marcha en código.
  • Flexible.Las plantillas se pueden anidar en cualquier nivel.
  • En línea con los principios de MVC.Promueve la separación de la interfaz de usuario y la lógica comercial.Todos los datos se crean con anticipación y se transmiten a la plantilla.

Ventajas:

  • familiar para los desarrolladores de StringTemplate Java

Contras:

  • La sintaxis de plantilla simplista puede interferir con el resultado previsto (p. ej. conflicto jQuery)

Latidos de ala

Wing Beats es un DSL interno para crear XHTML.Está basado en F# e incluye un motor de visualización ASP.NET MVC, pero también se puede utilizar únicamente por su capacidad de crear XHTML.

Ventajas:

  • Comprobación en tiempo de compilación de XML válido
  • Coloración de sintaxis
  • inteligencia completa
  • Vistas compiladas
  • Extensibilidad mediante clases, funciones, etc. de CLR habituales.
  • Componibilidad y manipulación perfectas ya que es código F# normal
  • Unidad comprobable

Contras:

  • Realmente no escribes HTML sino código que representa HTML en un DSL.

XsltViewEngine (MvcContrib)

Objetivos de diseño:

Crea vistas desde XSLT familiar

Ventajas:

  • ampliamente ubicuo
  • lenguaje de plantilla familiar para desarrolladores XML
  • Basado en XML
  • probado en el tiempo
  • Los errores de sintaxis y de anidamiento de elementos se pueden detectar estáticamente.

Contras:

  • El estilo de lenguaje funcional dificulta el control del flujo.
  • XSLT 2.0 (¿probablemente?) no es compatible.(XSLT 1.0 es mucho menos práctico).

Otros consejos

Mi elección actual es la maquinilla de afeitar. Es muy limpio y fácil de leer y mantiene las páginas de vista muy fácil de mantener. También hay compatibilidad con IntelliSense que es realmente grande. Alos, cuando se utiliza con ayudantes web es realmente de gran alcance también.

Para obtener una muestra simple:

@Model namespace.model
<!Doctype html>
<html>
<head>
<title>Test Razor</title>
</head>
<body>
<ul class="mainList">
@foreach(var x in ViewData.model)
{
<li>@x.PropertyName</li>
}
</ul>
</body>

Y ahí lo tienen. Esto es muy limpio y fácil de leer. Por supuesto, eso es un ejemplo sencillo pero incluso en las páginas complejas y forma todavía es muy fácil de leer y entender.

En cuanto a las desventajas? Bien hasta ahora (soy nuevo en esto) cuando se utilizan algunos de los ayudantes de formas hay una falta de apoyo a la adición de una referencia de clase CSS que es un poco molesto.

Gracias Nathj07

Yo sé que esto no responde realmente a su pregunta, pero diferentes Ver los motores tienen diferentes propósitos. El Spark Ver motor, por ejemplo, tiene como objetivo eliminar los puntos de vista de "sopa etiqueta" tratando de hacer todo lo fluidez y de fácil lectura.

Su mejor opción sería la de simplemente mirar en algunas implementaciones. Si se ve atractivo a la intención de su solución, probarlo. Usted puede mezclar y motores de vista del partido en MVC, por lo que no debería ser un problema si decide no ir con un motor específico.

SharpDOM . Este es un dsl interna c # 4.0 para generar html y también asp.net motor vista mvc.

ndjango . Es muy fácil de usar y muy flexible. Se puede ampliar fácilmente la funcionalidad de vista con las etiquetas y filtros personalizados. Creo que "en gran medida ligado a F #" es bastante ventaja que desventaja.

Creo que esta lista debe incluir también muestras de cada motor de vista que los usuarios puedan obtener un sabor de cada uno sin tener que visitar cada sitio web.

Fotos dicen más que mil palabras y muestras de marcas son como las capturas de pantalla para los motores de vista :) Así que aquí está uno de mi rel="nofollow Spark Vista Motor

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
  <li each="var p in products">${p.Name}</li>
</ul>
<else>
  <p>No products available</p>
</else>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top