tecnicas - ¿Cómo puedo superar mis temores de<%%> en mi marcado ASP.Net MVC?
ejercicios para vencer el miedo (12)
Así que compre totalmente los aspectos básicos de ASP.NET, capacidad de prueba, SoC, control de HTML ... es increíble. Sin embargo, siendo nuevo en esto, tengo un gran problema con el marcado. Sé que proviene de mi odio por el clásico ASP, y no puedo evitar sentir que he entrado en la zona de penumbra cuando veo esto .
No sé cuál es la alternativa (¿puedo usar controles de servidor, enlace de datos, etc.?)
1) Ayudantes reducen el ruido HTML
2) Vistas parciales para dividir páginas más grandes / código de vista de reutilización
3) Pruebe con un motor de representación diferente, como Sparkline
4) REFACTOR si su vista incluye demasiadas declaraciones if
.
Mueva un poco (no todos, solo en caso de que tenga sentido) lógica de visualización (como sus fechas) en su modelo. Por ejemplo, en su ejemplo, podría agregar una propiedad de cadena Task.DisplayDate que maneja la llamada .ToShortDateString (). Entonces, si alguna vez cambia, lo cambia todo en un solo lugar y acorta el código en la vista.
Los ayudantes de HTML son agradables, a veces. Realmente no me gusta tener mi HTML en cadenas concatenadas o un StringBuilder en una clase en alguna parte, pero si estás haciendo algo que funciona con una gran cantidad de conjuntos de datos diferentes, no son tan malos.
También cambiaría sus preferencias de formato de código C # para tener corchetes en la misma línea. Eso reduce el desorden. Desafortunadamente, no puede tener configuraciones separadas para esto entre el editor de código y el editor de HTML, por lo que también deberá acostumbrarse a él en su código. No es lo peor del mundo.
Lo que otros han dicho también ayuda: utilizar vistas parciales y escribir fuerte.
Evitar la lectura de sopa de etiquetas podría ser útil. En general, no puede usar controles de servidor (aunque algunos podrían funcionar), no hay devolución de datos ni viewstate. No creo que pueda usar databinding (de nuevo podría haber excepciones, no estoy seguro de cómo ASP.NET MVC trata los controles del servidor en la vista). El método más fácil de "databind" es pasar una lista o matriz. de datos en la vista y use foreach para crear HTML a partir de ella.
Si está hablando sobre el HTML de los controles renderizados, me temo que no mejorará solo porque tiene un buen envoltorio basado en estándares alrededor de su View in MVC. Sin controles adaptados, el resultado sigue siendo el código de tabla anidada de circa 1995.
Gracias, Microsoft!
Si presiona ctrl + z después de formatearlo, simplemente deshace el formateo y no el tipeo.
Encuentro esto útil para mantener el primer corchete en la misma línea que el enunciado if
Me gusta hacer resaltar la sintaxis para mis etiquetas "<%%>" muy similar al color de fondo. Utilizo un fondo negro y un color plateado (no tengo el color específico en la atmósfera de la mano) para mis etiquetas "<%%>". Eso más las otras sugerencias aquí deberían haber hecho que tu código sea más legible. Por supuesto, siempre puedes probar otro motor de visualización (¡esa es la belleza de MVC!)
Me gustaría ver algunos de los otros motores de View disponibles, personalmente me gusta mucho el motor de vista Spark, pero hay muchos otros por ahí.
Scott Hanselman hizo una gran publicación mirando a spark y Nhaml con algunos fragmentos de marcado que puedes ver para ver si se ajustan a tus estéticos :)
http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx
Muy ocasionalmente uso métodos de ayuda (NO estoy hablando de los métodos de extensión de ayuda) para escribir código HTML en la vista usando el modelo de objetos Html. No recomendaría esto a menos que tenga alguna lógica extraña que no pueda escribir fácilmente en la vista. Siempre que el código en .aspx.cs sea VER código, está bien.
En el archivo .aspx de su Vista:
<%-- render section --%>
<% RenderTextSection(section); %>
En el ''código subyacente'' de su vista utiliza HtmlGenericControl para crear HTML y luego la siguiente línea para escribirlo:
htmlControl.RenderControl(new HtmlTextWriter(Response.Output));
Mi método completo:
protected void RenderTextSection(ProductSectionInfo item)
{
HtmlGenericControl sectionTextDiv = new HtmlGenericControl("div");
bool previousHasBulletPoint = false;
System.Web.UI.HtmlControls.HtmlControl currentContainer = sectionTextDiv;
foreach (var txt in item.DescriptionItems)
{
if (!previousHasBulletPoint && txt.bp)
{
// start bulleted section
currentContainer = new HtmlGenericControl("UL");
sectionTextDiv.Controls.Add(currentContainer);
}
else if (previousHasBulletPoint && !txt.bp)
{
// exit bulleted section
currentContainer = sectionTextDiv;
}
if (txt.bp)
{
currentContainer.Controls.Add(new HtmlGenericControl("LI")
{
InnerHtml = txt.t
});
}
else
{
currentContainer.Controls.Add(new HtmlGenericControl()
{
InnerHtml = txt.t
});
}
previousHasBulletPoint = txt.bp;
}
sectionTextDiv.RenderControl(new HtmlTextWriter(Response.Output));
}
Sugeriría mirar el motor de plantillas Velocity que utilizó MonoRails. ASP.NET MVC se modela muy de cerca en el formato MonoRails, por lo que usar las plantillas Velocity es bastante fácil.
use los comentarios del lado del servidor <%-- comment --%>
para separar bloques y aumentar la legibilidad. use espaciado de línea adicional para separar bloques también (SO por lo que parece estar acabando con el espaciado de línea aquí por alguna razón).
<%-- Go through each testimonial --%>
<% foreach (var testimonial in ViewData.Model.Testimonials) { %>
<div class="testimonialFrame">
<div class="testimonialHeader"><%= testimonial.summaryText %></div>
<%-- Show video if available --%>
<% if (string.IsNullOrEmpty(testimonial.Video.FullURL) == false) { %>
<div style="padding-top:12px">
<% Html.RenderAction("YouTubeControl", "Application", new { youTubeId = testimonial.Video.FullURL }); %>
</div>
<% } %>
<div class="roundedBox" style="margin-top:15px">
<div id="txtTestimonialText" class="testimonialText paddedBox"><%= testimonial.TestimonialText %></div>
</div>
<div class="testimonialFooter"><%= testimonial.name %></div>
</div>
<% } %>
Bueno, ahora puedes probar Razor (en ASP.NET MVC 3)
Solo espero que la "@" no te asuste también: P
Hay cosas que puedes hacer para ayudar a limpiar el marcado, pero estoy de acuerdo en que puede ser un poco complicado.
- Puede crear sus propios ayudantes de HTML para generar datos utilizando métodos de extensión, de modo que pueda ocultar parte de la lógica if / else, la iteración, etc.
- Escriba trás las vistas para poder ver
ViewData.Model.myProperty
lugar de(MyClasst)ViewData["foo"].myProperty
Por ejemplo, esta es una extensión que hice para hacer un RSS-spitter-outer :)
public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss) where T : IRSSable
{
StringBuilder result = new StringBuilder();
if (rss.Count() > 0)
{
foreach (IRSSable item in rss)
{
result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>");
}
}
return result.ToString();
}
Entonces, en mi parte delantera, todo lo que tengo es <%=Html.RSSRepeater(mydata)%>
que es mucho más agradable.