template tag post_title info blog c# asp.net-mvc-3 razor orchardcms

c# - tag - wordpress title hook



¿Qué hace un bloque de código @functions en un archivo de afeitar, y cuándo(si es que lo hago) debo usarlo? (4)

Desde msdn blogs , @functions block es para permitirle envolver código reutilizable, como los métodos y propiedades

Mientras miraba un tema que descargué de la galería de Orchard CMS, noté que un archivo Layout.cshtml tenía este bloque de código en la parte superior del archivo:

@functions { // To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. string CalcuClassify(string[] zoneNames, string classNamePrefix) { var zoneCounter = 0; var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; } }

Sé lo que hace la función declarada (calcula qué zonas se rellenan para devolver el ancho de cada columna), mi pregunta es: ¿cuál es el uso correcto del bloque @function y cuándo debería usarlo alguna vez?


El bloque @functions permite definir funciones de utilidad directamente en la vista, en lugar de agregarlas como extensiones al helper @Html o @Html al controlador sobre las propiedades de visualización. Desearía usarlo cuando pueda cumplir estas condiciones:

  1. La funcionalidad está estrechamente relacionada con la vista y, en general, no es útil en otros lugares (por ejemplo, "¿Qué tan ancho hago mis columnas?").
  2. La funcionalidad es más que una simple declaración if y / o se usa en múltiples lugares en su vista.
  3. Todo lo que la función necesita para determinar su lógica ya existe en el Model para la vista.

Si falla el primero, agréguelo como un ayudante @Html .

Si no pasa el segundo, simplemente en línea.

Si falla el tercero, debe hacer el cálculo en su controlador y pasar el resultado como parte del modelo.


En este caso particular, las personas que crearon el tema que está usando probablemente intentaron mantenerlo como un tema simple (solo vistas, css e imágenes).

Si necesita escribir algún código para un tema para Orchard, debe recurrir a un módulo (como se indica aquí: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme ) a menos que escriba este código en la vista.

No estoy seguro de que valga la pena cambiar de un tema a un módulo solo para obtener el tamaño de una columna.


Otros han explicado lo que hace @functions , así que no voy a repetir eso. Pero me gustaría agregar esto:

Si su vista se escribe a un modelo de vista, creo que una opción viable sería mover esta lógica al modelo de vista para evitar saturar su marcado con demasiado código. De lo contrario, sus puntos de vista comenzarán a parecerse más al ASP clásico y no creo que nadie quiera eso.

No creo que haya nada de malo en usar @functions o @helper en su opinión, pero una vez que haya más allá de un par de métodos en su vista, o incluso si la función es algo complicada, podría valer la pena refactorizar al modelo de vista si en lo posible. Si se trata de un código que se puede reutilizar, puede ser una buena idea sacarlo a una clase de ayuda o una extensión a la clase HtmlHelper. Una cosa que es un fastidio es darse cuenta de que acaba de volver a escribir un fragmento de código que ya existía porque no sabía que estaba escondido en una vista arbitraria.