<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tutorial de NVelocity &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/es/category/c-es/bliblioteca-de-c/tutorial-de-nvelocity/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>Estudio Independiente de Desarrollo de Software</description>
	<lastBuildDate>Fri, 14 Aug 2026 03:51:20 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://www.foxdevelop.com/wp-content/uploads/2026/05/fox-svgrepo-com-1.png</url>
	<title>Tutorial de NVelocity &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Caracteres de escape y sentencias if</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/caracteres-de-escape-y-sentencias-if/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/caracteres-de-escape-y-sentencias-if/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:51:20 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8536</guid>

					<description><![CDATA[Caracter de escape barra invertida + sintaxis condicional #if 1. Reglas de escape con barra invertida \ Variable predefinida：#set($dog = "woof woof") Código VTL Salida renderizada Explicación $dog woof woof ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Caracter de escape barra invertida + sintaxis condicional #if</p>



<h4 class="wp-block-heading">1. Reglas de escape con barra invertida \</h4>



<p class="wp-block-paragraph">Variable predefinida：<code>#set($dog = "woof woof")</code></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Código VTL</th><th>Salida renderizada</th><th>Explicación</th></tr></thead><tbody><tr><td><code>$dog</code></td><td>woof woof</td><td>Resolución normal de variable</td></tr><tr><td><code>\$dog</code></td><td>$dog</td><td><strong>Una sola barra invertida</strong>：escapa el siguiente <code>$</code>, desactiva la resolución de variable e imprime <code>$</code> literalmente</td></tr><tr><td><code>\\$dog</code></td><td>\woof woof</td><td>La primera <code>\</code> escapa la segunda <code>\</code> → muestra <code>\</code>；<br>el resto <code>$dog</code> se resuelve normalmente</td></tr><tr><td><code>\\\$dog</code></td><td>\$dog</td><td><code>\\</code> muestra <code>\</code>, <code>\$</code> muestra <code>$</code></td></tr><tr><td><code>\\\\$dog</code></td><td>\woof woof</td><td><code>\\</code> muestra <code>\</code>, <code>\\</code> muestra <code>\</code>；<br><code>$dog</code> resuelve la variable</td></tr></tbody></table></figure>



<ol class="wp-block-list">
<li>Los nombres de variable Velocity<strong>deben empezar por letra</strong>. <code>$10.0</code> no se interpreta como variable y se muestra tal cual. Por lo tanto textos como <code>Microsoft $10,0 USD</code> no necesitan escape adicional；</li>



<li><strong>Las barras invertidas consecutivas se cancelan por pares</strong>；solo la combinación <code>\$</code> puede escapar el símbolo dólar；</li>



<li>Para mostrar literalmente <code>$nombreVariable</code> en la página, sintaxis estándar：<code>\$dog</code>.</li>
</ol>



<h4 class="wp-block-heading">2. Sintaxis condicional de ramas #if</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($ages = 22)</span>
<span class="hljs-comment">#if ($ages &lt;13)</span>
    &lt;h1&gt;Eres un niño&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;18)</span>
    &lt;h1&gt;Eres un adolescente&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;35)</span>
    &lt;h1&gt;Eres un adulto joven&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;60)</span>
    &lt;h1&gt;Eres una persona de mediana edad&lt;/h1&gt;
<span class="hljs-comment">#else</span>
    &lt;h1&gt;Eres una persona mayor&lt;/h1&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<h5 class="wp-block-heading">Resultado de ejecución</h5>



<p class="wp-block-paragraph"><code>$ages=22</code>, cumple la condición <code>22 &lt; 35</code> → salida：<code>&lt;h1&gt;Eres un adulto joven&lt;/h1&gt;</code></p>



<h5 class="wp-block-heading">Notas importantes</h5>



<ol class="wp-block-list">
<li>Es<strong>obligatorio cerrar el bloque con <code>#end</code></strong>；si falta se produce error de análisis；</li>



<li>Palabra clave：<code>#elseif</code>（<strong>no escribir #else if con espacio</strong>, es sintaxis incorrecta）；</li>



<li>Operadores soportados：<code>&lt; > &lt;= >= == != &amp;&amp; ||</code> y otros；</li>



<li>Se evalúa de arriba hacia abajo. Cuando se cumple una condición, las ramas siguientes no se ejecutan.</li>
</ol>



<p class="wp-block-paragraph">Caracteres de escape y sentencias if</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/caracteres-de-escape-y-sentencias-if/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Métodos de extensión</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/metodos-de-extension/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/metodos-de-extension/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:46:25 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8520</guid>

					<description><![CDATA[1. Código de la entidad Person en backend (C#) Definir variables de objeto en el código backend C# 2. Código de plantilla VTL &#38; notas de renderizado 1. $pTest.getMyName() ✅ ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h4 class="wp-block-heading">1. Código de la entidad Person en backend (C#)</h4>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">string</span> name;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Name
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> name; }
        <span class="hljs-keyword">set</span> { name = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> Age
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> age; }
        <span class="hljs-keyword">set</span> { age = <span class="hljs-keyword">value</span>; }
    }

    <span class="hljs-comment">//Constructor sin parámetros</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"></span>)</span>{}
    <span class="hljs-comment">//Constructor con parámetros</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> name, <span class="hljs-keyword">int</span> age</span>)</span>
    {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    }

    <span class="hljs-comment">//Método de instancia sin parámetros</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> <span class="hljs-title">getMyName</span>(<span class="hljs-params"></span>)</span>
    {
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.name;
    }

    <span class="hljs-comment">//Método de instancia con varios parámetros</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> <span class="hljs-title">JoinStr</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> str1, <span class="hljs-keyword">string</span> str2</span>)</span>
    {
        <span class="hljs-keyword">return</span> str1 + str2;
    }
}</code></span></pre>


<p class="wp-block-paragraph">Definir variables de objeto en el código backend C#</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Person pTest = <span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Tom"</span>, <span class="hljs-number">22</span>);
context.Put(<span class="hljs-string">"pTest"</span>, pTest);</code></span></pre>


<h4 class="wp-block-heading">2. Código de plantilla VTL &amp; notas de renderizado</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">Llamada al método&lt;br /&gt;
$pTest.getMyName();

<span class="hljs-comment">#set($a = "hello")</span>
<span class="hljs-comment">#set($b = "foxdevelop")</span>

$pTest.JoinStr($a, $b);</code></span></pre>


<h5 class="wp-block-heading">1. <code>$pTest.getMyName()</code></h5>



<ul class="wp-block-list">
<li>Llamar al método <strong>sin parámetros</strong> del objeto <code>getMyName()</code></li>



<li>Devuelve <code>Tom</code></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Llamada de método sin parámetros en Velocity: los paréntesis <code>()</code> se pueden omitir, <code>$pTest.getMyName</code> equivale a <code>$pTest.getMyName()</code></p>
</blockquote>



<h5 class="wp-block-heading">2. <code>$pTest.JoinStr($a, $b)</code></h5>



<ul class="wp-block-list">
<li>Ejecutar método con dos parámetros de cadena</li>



<li>VTL resuelve primero <code>$a</code>, <code>$b</code> y pasa los valores reales <code>"hello"</code>, <code>"foxdevelop"</code></li>



<li>Retorna el resultado concatenado: <code>hellofoxdevelop</code></li>
</ul>



<h4 class="wp-block-heading">Resumen</h4>



<ol class="wp-block-list">
<li><strong>El nombre del método distingue mayúsculas y minúsculas</strong><br>C# <code>getMyName()</code> ≠ <code>GetMyName()</code>, la plantilla debe coincidir exactamente con la escritura del código.</li>



<li><strong>Pasa variables directamente</strong><br>No añadas comillas extra, <code>$pTest.JoinStr($a,$b)</code> es correcto; no uses <code>$pTest.JoinStr("$a","$b")</code> (pasará la cadena literal «$a»)</li>



<li><strong>Diferencia entre propiedad y método</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>$pTest.Name</code> → acceder a propiedad (getter)</li>



<li><code>$pTest.getMyName()</code> → llamada a método</li>
</ul>



<ol class="wp-block-list">
<li><strong>Los valores devueltos se imprimen automáticamente</strong><br>Escribe directamente <code>$objeto.metodo()</code> en la plantilla, Velocity muestra el valor devuelto automáticamente. Usa <code>#set</code> para capturar el resultado sin imprimirlo:</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($result = $pTest.JoinStr($a,$b))</span></code></span></pre>


<h4 class="wp-block-heading">3. Salida final renderizada de la página</h4>


<pre class="wp-block-code"><span><code class="hljs">Llamada al método
Tom;

hellofoxdevelop;</code></span></pre>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Métodos de extensión</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/metodos-de-extension/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Notas complementarias sobre límites de variable</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/notas-complementarias-sobre-limites-de-variable/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/notas-complementarias-sobre-limites-de-variable/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:32:54 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8504</guid>

					<description><![CDATA[Predefinición de variable：#set ($valok = "hello foxdevelop") Límite de variable ${} y diferencias de acceso con . Código Resultado renderizado Explicación $valok hello foxdevelop Salida básica de variable $valok.com hello ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Predefinición de variable：<code>#set ($valok = "hello foxdevelop")</code></p>



<h4 class="wp-block-heading">Límite de variable <code>${}</code> y diferencias de acceso con <code>.</code></h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Código</th><th>Resultado renderizado</th><th>Explicación</th></tr></thead><tbody><tr><td><code>$valok</code></td><td>hello <code>foxdevelop</code></td><td>Salida básica de variable</td></tr><tr><td><code>$valok.</code>com</td><td>hello <code>foxdevelop</code>.com</td><td>Velocity intenta invocar la propiedad/método <code>cn</code> del objeto <code>valok</code>; la cadena no dispone de ese método, <strong>se imprime la variable y el sufijo tal cual</strong></td></tr><tr><td><code>${valok}.com</code></td><td>hello <code>foxdevelop</code>.com</td><td><code>{}</code> delimita la variable. Una vez renderizada <code>valok</code>, se concatena el texto literal <code>.com</code> (sintaxis recomendada)</td></tr><tr><td><code>$!valok.com</code></td><td>hello<code>foxdevelop</code>.com</td><td>Referencia silenciosa <code>$!</code>: funciona igual que <code>$valok</code> si existe la variable; devuelve cadena vacía en lugar de mostrar <code>$xxx</code> si no existe</td></tr><tr><td><code>${valok.com}</code></td><td><strong>vacío</strong></td><td>Intenta leer la propiedad <code>valok.com</code>. La cadena no tiene esa propiedad, la variable no existe. Usa <code>$!{valok.com}</code> para obtener cadena vacía</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><br><code>${valok}.cn</code> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Concatenar variable + sufijo<br><code>${valok.cn}</code> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Acceder a la propiedad cn del objeto valok</p>



<h4 class="wp-block-heading">Comillas simples / dobles &amp; fusión de variables</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Código</th><th>Resultado renderizado</th><th>Explicación</th></tr></thead><tbody><tr><td><code>what$valok</code></td><td>whathello <code>foxdevelop</code></td><td>Concatenación directa, Velocity detecta automáticamente el límite de variable</td></tr><tr><td><code>what$"valok"</code></td><td>what$»valok»</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sintaxis no válida. No se puede poner comilla justo después de <code>$</code>, no se interpreta la variable</td></tr><tr><td><code>what"$valok"</code></td><td>what»hello <code>foxdevelop</code>«</td><td>Las comillas son caracteres ordinarios dentro de plantilla, no activan análisis de cadena; la variable se resuelve correctamente</td></tr><tr><td><code>what'$valok'</code></td><td>what&#8217;hello <code>foxdevelop</code>&#8216;</td><td>Mismo comportamiento, las comillas simples son caracteres literales</td></tr><tr><td><code>$valokwhat</code></td><td>$valokwhat</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Variable no reconocida. Velocity toma <code>valokwhat</code> como nombre completo de variable y muestra el texto original si no la encuentra</td></tr><tr><td><code>${valok}what</code></td><td>hello <code>foxdevelop</code>what</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Las llaves delimitan la variable, soluciona la fusión entre variable y texto</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">Resumen</h4>



<ol class="wp-block-list">
<li><strong>Usa siempre <code>${nombreVariable}</code> cuando la variable se une a otro texto</strong><br>Incorrecto：<code>$valokwhat</code>；Correcto：<code>${valok}what</code></li>



<li><strong>Para añadir sufijo: escribe <code>${valok}.cn</code>, no <code>${valok.cn}</code></strong></li>



<li><strong>Referencia silenciosa <code>$!variable</code></strong>: devuelve vacío si no existe la variable, no imprime <code>$xxx</code></li>



<li><strong>Las comillas dentro del HTML de plantilla son caracteres normales</strong>；<strong>Solo dentro de asignaciones #set</strong> las comillas simples (no resuelven variables) y dobles (resuelven variables) tienen comportamiento distinto</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($a = "$valok") // Comillas dobles: resuelve variable, a=hello bamn</span>
<span class="hljs-comment">#set($a = '$valok') // Comillas simples: no resuelve variable, a=$valok</span></code></span></pre>


<p class="wp-block-paragraph">Notas complementarias sobre límites de variable</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/notas-complementarias-sobre-limites-de-variable/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Iterar colecciones</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/iterar-colecciones/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/iterar-colecciones/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:21:47 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8488</guid>

					<description><![CDATA[Velocity #foreach — Iterar sobre colecciones y objetos 1. Iterar sobre una lista de cadenas Código backend en C# Código de plantilla Velocity Resultado de ejecución: recorre cada cadena de ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Velocity #foreach — Iterar sobre colecciones y objetos</p>



<h4 class="wp-block-heading">1. Iterar sobre una lista de cadenas</h4>



<h5 class="wp-block-heading">Código backend en C#</h5>


<pre class="wp-block-code"><span><code class="hljs language-cs">List&lt;<span class="hljs-keyword">string</span>&gt; strList = <span class="hljs-keyword">new</span> List&lt;<span class="hljs-keyword">string</span>&gt;() {<span class="hljs-string">"dsd"</span>,<span class="hljs-string">"sdfsd"</span>,<span class="hljs-string">"asdfsd"</span>,<span class="hljs-string">"asdfsdfsd"</span>};
context.Put(<span class="hljs-string">"strList"</span>, strList);</code></span></pre>


<h5 class="wp-block-heading">Código de plantilla Velocity</h5>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#foreach($str in $strList)</span>
    $str &lt;br/&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<p class="wp-block-paragraph">Resultado de ejecución: recorre cada cadena de la lista y la imprime con salto de línea.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="406" height="184" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16.png" alt="" class="wp-image-7102" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16.png 406w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16-300x136.png 300w" sizes="(max-width: 406px) 100vw, 406px" /></figure>



<h5 class="wp-block-heading">Explicación de sintaxis</h5>



<p class="wp-block-paragraph"><code>#foreach(variableBucle in colección)</code> inicia el bucle, <code>#end</code> lo cierra.</p>



<h4 class="wp-block-heading">2. Iterar sobre lista de clases de entidad personalizadas</h4>



<h5 class="wp-block-heading">1. Entidad Person (C#)</h5>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">string</span> name;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Name
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> name; }
        <span class="hljs-keyword">set</span> { name = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> Age
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> age; }
        <span class="hljs-keyword">set</span> { age = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"></span>)</span>{}
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> name,<span class="hljs-keyword">int</span> age</span>)</span>
    {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    }
}</code></span></pre>


<h5 class="wp-block-heading">2. Preparar la lista en el backend</h5>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">List</span>&lt;Person&gt; pList = <span class="hljs-keyword">new</span> <span class="hljs-keyword">List</span>&lt;Person&gt;();
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Jack"</span>, <span class="hljs-number">1</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Ben"</span>, <span class="hljs-number">11</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Kevin"</span>, <span class="hljs-number">100</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Simon"</span>, <span class="hljs-number">500</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Lulu"</span>, <span class="hljs-number">20</span>));
context.Put(<span class="hljs-string">"pList"</span>, pList);</code></span></pre>


<h5 class="wp-block-heading">3. Sintaxis para acceder a propiedades en plantilla</h5>



<p class="wp-block-paragraph">Código de plantilla:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">#foreach($per in $pList)
<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end</code></span></pre>


<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong>No se pueden leer los datos : aparecen errores o contenido vacío</strong></p>



<h4 class="wp-block-heading">Principio fundamental</h4>



<p class="wp-block-paragraph">Reglas de acceso a propiedades de objetos en Velocity:<br><code>$per.xxx</code> busca automáticamente el <strong>método Get público <code>GetXxx()</code></strong></p>



<ul class="wp-block-list">
<li><code>$per.name</code> → intenta invocar <code>per.getName()</code></li>



<li><code>$per.age</code> → intenta invocar <code>per.getAge()</code></li>
</ul>



<p class="wp-block-paragraph">Tu entidad:</p>



<ul class="wp-block-list">
<li>Campos privados: <code>name</code>, <code>age</code></li>



<li><strong>Propiedades públicas con primera letra mayúscula: <code>Name</code>, <code>Age</code></strong>, métodos correspondientes <code>GetName()</code>, <code>GetAge()</code></li>
</ul>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />Sintaxis correcta de plantilla:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">#foreach($per in $pList)
<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Nota: En C# las propiedades empiezan con mayúscula; en Java suelen ser minúsculas. Es una trampa común de mayúsculas y minúsculas para quienes empiezan.</p>
</blockquote>



<h4 class="wp-block-heading">3. Variables integradas útiles de #foreach</h4>



<p class="wp-block-paragraph">Variables disponibles directamente dentro del bucle:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Variable</th><th>Función</th></tr></thead><tbody><tr><td><code>$foreach.index</code></td><td>Índice actual, <strong>empieza en 0</strong></td></tr><tr><td><code>$foreach.count</code></td><td>Número secuencial actual, <strong>empieza en 1</strong></td></tr><tr><td><code>$foreach.first</code></td><td>Indica si es el primer registro (valor booleano)</td></tr><tr><td><code>$foreach.last</code></td><td>Indica si es el último registro (valor booleano)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Ejemplo:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#foreach($per in $pList)</span>
    $foreach.count , Nombre: $per.Name
<span class="hljs-comment">#end</span></code></span></pre>


<h4 class="wp-block-heading">4. Mostrar en tabla</h4>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">table</span> <span class="hljs-attr">border</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">cellpadding</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">cellspacing</span>=<span class="hljs-string">"0"</span>&gt;</span>
#foreach($per in $pList)
    <span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end
<span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span></code></span></pre>


<h4 class="wp-block-heading">Resumen</h4>



<ol class="wp-block-list">
<li><code>#foreach(variable in colección)</code> + <code>#end</code> es el bucle estándar de Velocity;</li>



<li>Para listas normales, imprime directamente <code>$variable</code>;</li>



<li>Al iterar objetos de entidad: <code>$objeto.nombrePropiedad</code> <strong>respeta la capitalización de las propiedades públicas</strong>, no accedas a campos privados;</li>



<li>En entidades C# se recomienda usar mayúscula inicial en propiedades y mantener la misma escritura en plantillas;</li>



<li>Si los datos aparecen vacíos, revisa primero <strong>mayúsculas/minúsculas de propiedades y la existencia del accesor get</strong>.</li>
</ol>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Iterar colecciones</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/iterar-colecciones/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comentarios</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/comentarios-3/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/comentarios-3/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:12:27 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8472</guid>

					<description><![CDATA[1. Diferencias entre comentarios de plantilla Sintaxis Tipo Características &#60;!-- Comentario HTML --&#62; Comentario nativo HTML Se muestra en el código fuente final de la página, visible al ver el ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">1. Diferencias entre comentarios de plantilla</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Sintaxis</th><th>Tipo</th><th>Características</th></tr></thead><tbody><tr><td><code>&lt;!-- Comentario HTML --&gt;</code></td><td>Comentario nativo HTML</td><td><strong>Se muestra en el código fuente final de la página</strong>, visible al ver el código desde el navegador</td></tr><tr><td><code>## Comentario de una línea</code></td><td>Comentario de una línea Velocity</td><td>Solo reconocido por el motor, <strong>no se renderiza en la página</strong>, válido hasta el final de la línea</td></tr><tr><td><code>#* Contenido comentario multilínea *#</code></td><td>Comentario multilínea Velocity</td><td>Admite saltos de línea, <strong>no se renderiza en la página</strong></td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Recomendación de desarrollo: usa preferiblemente <code>##</code> / <code>#* *#</code> para comentarios de lógica de negocio, evitando filtrar comentarios en el código fuente de la página.</p>
</blockquote>



<h3 class="wp-block-heading">2. Reglas de nomenclatura de variables</h3>



<p class="wp-block-paragraph">Reglas básicas oficiales</p>



<ol class="wp-block-list">
<li>El primer carácter de la variable <strong>debe ser una letra</strong> (a‑z / A‑Z)</li>



<li>Caracteres permitidos después: letras, números <code>0‑9</code>, guion bajo <code>_</code>, guion <code>-</code></li>
</ol>



<h4 class="wp-block-heading">El guion <code>-</code> genera ambigüedad con operadores</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name-d = "test")</span></code></span></pre>


<p class="wp-block-paragraph">Al ejecutar salta el error: <code>Encountered "name" ... Was expecting one of:</code><br><strong>Causa: Velocity interpreta <code>-</code> como operador de resta!</strong><br>El motor lo analiza como <code>$name - d</code>, es decir variable <code>$name</code> menos variable <code>d</code>, generando conflicto sintáctico.</p>



<p class="wp-block-paragraph">Dos soluciones:</p>



<ol class="wp-block-list">
<li><strong>Recomendado: usar guion bajo</strong> (sin ambigüedad, convención habitual)</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name_d = "hello world")</span></code></span></pre>


<ol start="2" class="wp-block-list">
<li><strong>Delimitar variable con llaves</strong> (compatible con nombres que contienen guion)</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set(${name-d} = "hello world")</span>
${name-d}</code></span></pre>


<h4 class="wp-block-heading">Comparativa ejemplos válidos / inválidos</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Válido</span>
<span class="hljs-comment">#set($name_d = "guion bajo")</span>
<span class="hljs-comment">#set($name12d = "empieza por letra más números")</span>
<span class="hljs-comment">#set(${name-1_2d} = "guion requiere llaves")</span>

<span class="hljs-comment"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Guion directo sin llaves → error de análisis</span>
<span class="hljs-comment">#set($name-d = "¡Error!")</span>
<span class="hljs-comment">#set($name-1_2d = "¡Error!")</span></code></span></pre>


<h3 class="wp-block-heading">3. Normas de escritura para la sintaxis #set</h3>



<p class="wp-block-paragraph">Forma estándar (espacios alrededor de paréntesis flexibles, se recomienda mantener un estilo uniforme)</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($nombreVariable = "valor")</span></code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Las cadenas deben ir entre comillas dobles; mantén espacios alrededor del signo igual para mejorar la legibilidad.</p>
</blockquote>



<p class="wp-block-paragraph">Comentarios</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/comentarios-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Reutilización de plantillas</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/reutilizacion-de-plantillas/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/reutilizacion-de-plantillas/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:58:02 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8456</guid>

					<description><![CDATA[1. Función principal El motor de plantillas Velocity implementa la reutilización de plantillas mediante #include / #parse.Las partes comunes de una página web como la cabecera de navegación _head.htm y ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">1. Función principal</h3>



<p class="wp-block-paragraph">El motor de plantillas Velocity implementa la <strong>reutilización de plantillas</strong> mediante <code>#include</code> / <code>#parse</code>.<br>Las partes comunes de una página web como la cabecera de navegación <code>_head.htm</code> y el pie de página con derechos de autor <code>_footer.htm</code> se extraen en subplantillas independientes que se importan, evitando código HTML duplicado.</p>



<h3 class="wp-block-heading">2. Diferencias clave</h3>



<h4 class="wp-block-heading">1. <code>#include("ruta‑del‑archivo")</code></h4>



<p class="wp-block-paragraph"><strong>Simplemente imprime el contenido original del archivo, sin interpretar las variables Velocity (<code>$!{xxx}</code>) dentro de la subplantilla</strong></p>



<ul class="wp-block-list">
<li><code>$!{testinclude}</code> dentro de la subplantilla no se renderiza, se muestra literalmente la cadena <code>$!{testinclude}</code></li>



<li>Permite cargar <strong>varios archivos a la vez</strong>: <code>#include("a.htm","b.htm")</code></li>



<li>Ideal para: fragmentos HTML estáticos sin variables VTL</li>
</ul>



<h4 class="wp-block-heading">2. <code>#parse("ruta‑del‑archivo")</code></h4>



<p class="wp-block-paragraph"><strong>Importa la subplantilla e interpreta toda la sintaxis Velocity</strong>. Las variables enviadas desde la plantilla padre funcionan correctamente en la subplantilla.</p>



<ul class="wp-block-list">
<li><code>$!{testinclude}</code> en la subplantilla lee variables del contexto y muestra los valores proporcionados por el código backend</li>



<li><strong>Solo admite una ruta de archivo</strong>, no permite importar varios archivos simultáneamente</li>



<li>Ideal para: cabeceras, pies de página y otras plantillas comunes que usan <strong>variables</strong> (títulos de página, textos dinámicos de copyright…)</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Fragmento de tus notas:<br><code>#include pega el código de la subplantilla sin interpretarlo, mientras que #parse ejecuta el análisis sintáctico</code></p>
</blockquote>



<h3 class="wp-block-heading">3. Ejemplo práctico</h3>



<h4 class="wp-block-heading">1. Código backend (.cs)</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">context.Put(<span class="hljs-string">"testinclude"</span>, <span class="hljs-string">"Texto desde subplantilla:"</span>);</code></span></pre>


<h4 class="wp-block-heading">2. Contenido de la subplantilla <code>_footer.htm</code></h4>


<pre class="wp-block-code"><span><code class="hljs">Información de copyright $!{testinclude}</code></span></pre>


<h5 class="wp-block-heading">Caso ① usando <code>#include("./themes/default/_footer.htm")</code></h5>



<p class="wp-block-paragraph">Resultado de salida en la página:</p>


<pre class="wp-block-code"><span><code class="hljs">Información de copyright $!{testinclude}</code></span></pre>


<p class="wp-block-paragraph">La variable no se interpreta y el marcador se muestra tal cual.</p>



<h5 class="wp-block-heading">Caso ② usando <code>#parse("./themes/default/_footer.htm")</code></h5>



<p class="wp-block-paragraph">Resultado de salida en la página:</p>


<pre class="wp-block-code"><span><code class="hljs">Información de copyright Texto desde subplantilla:</code></span></pre>


<p class="wp-block-paragraph">La variable se resuelve correctamente. Por eso en proyectos reales se prefiere <code>#parse</code> para cabeceras y pies de página compartidos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. Recomendaciones de uso</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Directiva</th><th>Escenario adecuado</th></tr></thead><tbody><tr><td><code>#include</code></td><td>Recursos estáticos, texto plano, fragmentos HTML sin necesidad de procesar variables</td></tr><tr><td><code>#parse</code></td><td>Cabeceras, pies de página, barras laterales; plantillas con <code>$variables</code>, <code>#if</code> y demás sintaxis VTL</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Norma de desarrollo:<br>Usa <code>#parse</code> para componentes comunes que puedan necesitar valores dinámicos (navegación, pie de página). Usa <code>#include</code> para fragmentos puramente estáticos de texto o estilos.</p>



<p class="wp-block-paragraph">Reutilización de plantillas</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/reutilizacion-de-plantillas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Definir variables dentro de la plantilla</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/definir-variables-dentro-de-la-plantilla/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/definir-variables-dentro-de-la-plantilla/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:36:43 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8438</guid>

					<description><![CDATA[Hasta ahora las variables se definían en el código C# de detrás y luego se usaban dentro de las plantillas. De hecho, puedes definir variables directamente en la plantilla mediante ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hasta ahora las variables se definían en el código C# de detrás y luego se usaban dentro de las plantillas. De hecho, puedes definir variables directamente en la plantilla mediante la directiva set.</p>



<h3 class="wp-block-heading">1. Definir variables con <code>#set()</code></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Dos formas de declarar variables:<br>Método 1: definir variables previamente desde código backend C#/Java y leerlas en la plantilla;<br>Método 2: <strong>definir variables directamente dentro de la plantilla con <code>#set()</code></strong> (punto principal de esta lección)</p>



<p class="wp-block-paragraph"></p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name = "hello foxdevelop.com")</span>
<span class="hljs-comment">#set($okay = "common baby")</span>
<span class="hljs-comment">#set($nameokay = "$name|$okay")</span></code></span></pre>


<ul class="wp-block-list">
<li><code>#set(variable = valor)</code> admite cadenas, números, matrices, propiedades de objetos y asignaciones desde otras variables</li>



<li>Tipado débil, no hace falta declarar el tipo de la variable</li>
</ul>



<h3 class="wp-block-heading">2. Dos sintaxis y normas para renderizar variables</h3>



<h4 class="wp-block-heading">2.1 Formas básicas</h4>



<ul class="wp-block-list">
<li><code>$name</code>: si la variable no existe, imprime literalmente <code>$name</code></li>



<li><code>$!name</code>: <strong>renderizado silencioso</strong>; devuelve contenido vacío cuando falta la variable (recomendado para evitar textos extraños <code>$xxx</code> en la página)</li>



<li>Sintaxis estándar recomendada: <strong><code>${name}</code></strong> (las llaves delimitan explícitamente la variable)</li>
</ul>



<h4 class="wp-block-heading">2.2 Ejemplo de problema de límites</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name = "hello")</span>
$namehello     × el motor lo interpreta como variable $namehello y no la encuentra
${name}hello   √ correcto: resuelve $name y concatena el texto hello</code></span></pre>


<h3 class="wp-block-heading">3. Comentarios de una sola línea <code>##</code></h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## Esto es un comentario, no aparecerá en el resultado final</span>
<span class="hljs-comment">#set($name = "test") ## también se admiten comentarios al final de línea</span></code></span></pre>


<ol class="wp-block-list">
<li>El texto de los comentarios <strong>no se envía a la página renderizada</strong>;</li>



<li>No se ven en el código fuente del navegador (el motor de plantillas los elimina durante el procesamiento).</li>
</ol>



<h3 class="wp-block-heading">4. Tipos de asignación soportados por #set</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## Asignación de cadena</span>
<span class="hljs-comment">#set($name = "hello world")</span>

<span class="hljs-comment">## Asignar una variable a otra</span>
<span class="hljs-comment">#set($obj= $name)</span>

<span class="hljs-comment">## Asignar propiedades de objeto</span>
<span class="hljs-comment">#set($obj.Friend = "monica")</span>
<span class="hljs-comment">#set($obj.Blame = $whitehouse.Leak)</span>

<span class="hljs-comment">## Llamar método y asignar su valor devuelto</span>
<span class="hljs-comment">#set($obj.Plan = $spindoctor.weave($web))</span>

<span class="hljs-comment">## Asignación numérica</span>
<span class="hljs-comment">#set($obj.Number = 123)</span>

<span class="hljs-comment">## Asignación de matriz</span>
<span class="hljs-comment">#set($obj.Say = &#91;"Not", $my, "fault"])</span></code></span></pre>


<h3 class="wp-block-heading">5. Reglas especiales para variables inexistentes</h3>


<pre class="wp-block-code"><span><code class="hljs language-php">$sadfsdfsd</code></span></pre>


<p class="wp-block-paragraph">Cuando el motor de plantillas no logra resolver la variable:</p>



<ul class="wp-block-list">
<li>Sintaxis normal <code>$sadfsdfsd</code>: imprime literalmente el texto <code>$sadfsdfsd</code></li>



<li>Si usas <code>$!sadfsdfsd</code>: devuelve cadena vacía cuando la variable no existe</li>
</ul>



<p class="wp-block-paragraph">Definir variables dentro de la plantilla</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/definir-variables-dentro-de-la-plantilla/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sintaxis básica de plantillas</title>
		<link>https://www.foxdevelop.com/es/2026/08/14/sintaxis-basica-de-plantillas/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/14/sintaxis-basica-de-plantillas/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:25:26 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8423</guid>

					<description><![CDATA[I. Pasar objetos de entidad a la plantilla 1. Clase de entidad PageInfo Hasta ahora solo pasábamos cadenas de texto simples. Esto resulta poco eficiente y dificulta el mantenimiento. Al ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">I. Pasar objetos de entidad a la plantilla</h3>



<h4 class="wp-block-heading">1. Clase de entidad PageInfo</h4>



<p class="wp-block-paragraph">Hasta ahora solo pasábamos cadenas de texto simples. Esto resulta poco eficiente y dificulta el mantenimiento. Al encapsular los datos en objetos de entidad el código es mucho más claro.</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">PageInfo</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">bool</span> IsShowImage;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">bool</span> IsShowImage1
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> IsShowImage; }
        <span class="hljs-keyword">set</span> { IsShowImage = <span class="hljs-keyword">value</span>; }
    }
}</code></span></pre>


<ul class="wp-block-list">
<li>Campo privado <code>IsShowImage</code>, expuesto mediante la propiedad pública <strong><code>IsShowImage1</code></strong></li>



<li>Acceso desde plantilla: <code>$info.IsShowImage1</code></li>
</ul>



<h4 class="wp-block-heading">2. Cargar datos en el contexto</h4>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-comment">//Contenedor de contexto de plantilla</span>
IContext context = <span class="hljs-keyword">new</span> VelocityContext();

PageInfo pi = <span class="hljs-keyword">new</span> PageInfo();
pi.IsShowImage1 = <span class="hljs-literal">true</span>;

<span class="hljs-comment">//Guardar el objeto pi en el contexto con la clave info</span>
context.Put(<span class="hljs-string">"info"</span>,pi);

<span class="hljs-comment">//Ejemplo de variable de cadena</span>
context.Put(<span class="hljs-string">"infotitle"</span>,<span class="hljs-string">"Hola"</span>);</code></span></pre>


<p class="wp-block-paragraph"><code>context.Put("nombreClave",datos)</code>：envía datos a la plantilla, la plantilla los lee con <code>$nombreClave</code>.</p>



<h3 class="wp-block-heading">II. Sintaxis principal de plantillas Velocity</h3>



<h4 class="wp-block-heading">1. Símbolo de directiva <code>#</code></h4>



<p class="wp-block-paragraph">Las instrucciones que empiezan por <code>#</code> son directivas. Las más usadas:<br><code>#if</code>, <code>#else</code>, <code>#end</code>, <code>#foreach</code>, <code>#set</code>, <code>#include</code></p>



<p class="wp-block-paragraph">Ejemplo de renderizado condicional:</p>



<p class="wp-block-paragraph">Prepara dos imágenes y colócalas en la carpeta Contents/Images de la raíz del sitio web. Cambia el valor de IsShowImage1 para visualizar una imagen u otra.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#if($info.IsShowImage1)</span>
    &lt;img src=<span class="hljs-string">"./Contents/Images/a.gif"</span> /&gt;
<span class="hljs-comment">#else</span>
    &lt;img src=<span class="hljs-string">"./Contents/Images/b.gif"</span> /&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<p class="wp-block-paragraph">Lógica: muestra a.gif cuando <code>IsShowImage1=true</code>, en caso contrario muestra b.gif</p>



<h4 class="wp-block-heading">2. Símbolo de variable <code>$</code></h4>



<ul class="wp-block-list">
<li><code>$nombreVariable</code>：muestra el valor de la variable</li>



<li><code>${nombreVariable}</code>：<strong>delimita el límite de variable</strong> (¡muy importante!)</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Caso práctico: texto justo después de la variable, el motor no distingue dónde termina el nombre de variable.</p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-php">Forma incorrecta: $infotitlefoxdevelop.com
El motor interpreta todo como una variable infotitlefoxdevelop que no existe.

Forma correcta: ${infotitle}foxdevelop.com
El motor resuelve la variable infotitle y concatena la cadena foxdevelop.com</code></span></pre>


<h4 class="wp-block-heading">3. Modificador de salida silenciosa <code>!</code> → <code>$!nombreVariable</code></h4>



<p class="wp-block-paragraph">Comportamiento por defecto: si la variable no existe, se imprime tal cual el texto <code>$nombreVariable</code><br><code>$!nombreVariable</code>：si la variable no existe o es null, devuelve vacío sin imprimir el signo dólar</p>



<p class="wp-block-paragraph">Ejemplo comparativo:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Sintaxis</th><th>Variable existe(valor=»Hola»)</th><th>Variable no existe</th></tr></thead><tbody><tr><td><code>$infotitle</code></td><td>Hola</td><td><code>$infotitle</code></td></tr><tr><td><code>$!infotitle</code></td><td>Hola</td><td>(vacío, no muestra nada)</td></tr><tr><td><code>${infotitle}</code></td><td>Hola</td><td><code>${infotitle}</code></td></tr><tr><td><code>$!{infotitle}</code></td><td>Hola</td><td>vacío</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Código de prueba completo:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">${infotitle}foxdevelop.com <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$!infotitlefoxdevelop.com <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$infotitle <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$!infotitle <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span></code></span></pre>


<h3 class="wp-block-heading">Resumen</h3>



<ol class="wp-block-list">
<li>Si concatenas texto después de una variable, envuélvela siempre con <code>${variable}</code></li>



<li>En entorno de producción usa preferiblemente <code>$!{nombreVariable}</code>, evita que valores nulos impriman <code>$xxx</code> y rompan el diseño</li>



<li>Para comprobar propiedades booleanas con <code>#if</code> escribe directamente <code>#if($info.IsShowImage1)</code>, no hace falta poner <code>==true</code></li>
</ol>



<p class="wp-block-paragraph">Sintaxis básica de plantillas</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/14/sintaxis-basica-de-plantillas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introducción a NVelocity</title>
		<link>https://www.foxdevelop.com/es/2026/08/01/introduccion-a-nvelocity/</link>
					<comments>https://www.foxdevelop.com/es/2026/08/01/introduccion-a-nvelocity/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 12:51:22 +0000</pubDate>
				<category><![CDATA[Tutorial de NVelocity]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7135</guid>

					<description><![CDATA[Motor de plantillas para la plataforma .NET, que constituye el port para .NET de Velocity, el motor para plataforma Java. Introducción Se usa ampliamente en proyectos ASP.NET;ASP.NET MVC cuenta con ...]]></description>
										<content:encoded><![CDATA[<p>Motor de plantillas para la plataforma .NET, que constituye el port para .NET de Velocity, el motor para plataforma Java.</p>


<h4 class="wp-block-heading">Introducción</h4>



<p class="wp-block-paragraph">Se usa ampliamente en proyectos ASP.NET;<br>ASP.NET MVC cuenta con el motor de plantillas Razor integrado;</p>



<p class="wp-block-paragraph">Muchos desarrolladores eligen NVelocity cuando desean incorporar el patrón MVC a proyectos tradicionales de páginas <code>.aspx</code>.</p>



<p class="wp-block-paragraph">NVelocity ya no recibe mantenimiento y solo se emplea en proyectos antiguos basados en .NET Framework. En proyectos nuevos, se recomiendan motores modernos como Razor o Handlebars.NET.</p>



<p class="wp-block-paragraph">Relación entre versiones y .NET Framework</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Versión .NET Framework</th><th>Versión NVelocity</th></tr></thead><tbody><tr><td>.NET 4.0</td><td>1.0 (última versión oficial)</td></tr><tr><td>.NET 2.0</td><td>0.5</td></tr><tr><td>.NET 1.0</td><td>0.48</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Velocity es un veterano motor de plantillas para Java, con una sintaxis sencilla que usa <code>#</code> y <code>$</code> como marcadores de plantilla. NVelocity trasplanta completamente esta sintaxis;</p>



<h4 class="wp-block-heading">Descarga</h4>



<p class="wp-block-paragraph">Su última actualización oficial fue en 2018 y la versión más reciente es la 1.2.0</p>



<p class="wp-block-paragraph">Puede descargarlo desde la siguiente dirección</p>



<p class="wp-block-paragraph">Es un proyecto de código abierto alojado en GitHub <a href="https://github.com/castleproject/NVelocity/tree/master">castleproject/NVelocity: Castle&#8217;s NVelocity</a></p>



<p class="wp-block-paragraph">El archivo oficial descargado no contiene una DLL compilada. Puede descargar el código fuente y compilarlo por su cuenta, o agregar directamente el proyecto a la solución de su aplicación.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="397" height="269" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13.png" alt="" class="wp-image-7081" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13.png 397w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13-300x203.png 300w" sizes="(max-width: 397px) 100vw, 397px" /></figure>



<p class="wp-block-paragraph">Abra el archivo sln con Visual Studio</p>



<p class="wp-block-paragraph">La última versión está desarrollada sobre .NET Core 2.1. Se aconseja actualizar el proyecto a .NET 4.8</p>



<p class="wp-block-paragraph">Tras compilar, encontrará las DLL en el directorio de salida</p>



<figure class="wp-block-image size-full"><img decoding="async" width="372" height="76" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14.png" alt="" class="wp-image-7082" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14.png 372w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14-300x61.png 300w" sizes="(max-width: 372px) 100vw, 372px" /></figure>



<p class="wp-block-paragraph">Luego solo tiene que integrarlo en otros proyectos web ASP.NET. Añada el archivo NVelocity.dll a su proyecto web.</p>



<h4 class="wp-block-heading">Integración en el proyecto</h4>



<p class="wp-block-paragraph">Agregue la referencia al ensamblado NVelocity.dll en su proyecto<br>Ventaja principal: este motor facilita implementar el cambio de múltiples plantillas (cambio de temas) en el sitio web</p>



<p class="wp-block-paragraph">Cree una carpeta llamada Themes en el directorio raíz del sitio web, que servirá como directorio principal de todas las plantillas<br>Dentro de Themes cree varias carpetas independientes para cada tema, por ejemplo:</p>



<p class="wp-block-paragraph">Cree la carpeta Themes en el directorio raíz web como directorio de temas</p>



<h4 class="wp-block-heading">Directorio de temas</h4>



<p class="wp-block-paragraph">A continuación cree una carpeta default para la plantilla predeterminada<br>Más adelante podrá añadir otros conjuntos de plantillas como Themes/blue, Themes/dark</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Directorio raíz web
└── Themes
    ├── <span class="hljs-keyword">default</span>      <span class="hljs-comment"># Archivos de la plantilla predeterminada</span>
    ├── dark         <span class="hljs-comment"># Archivos del tema oscuro</span>
    └── blue         <span class="hljs-comment"># Archivos del tema azul</span></code></span></pre>


<p class="wp-block-paragraph">En tiempo de ejecución se lee el nombre del tema activo desde la configuración y NVelocity carga las plantillas del directorio correspondiente.<br>Cambiar la plantilla consiste básicamente en modificar la configuración para apuntar a otra carpeta de temas, sin alterar el código de lógica de negocio.<br>Ideal para proyectos antiguos ASP.NET WebForm (.aspx) que requieren funcionalidad de cambio de apariencia de la interfaz pública.</p>



<h4 class="wp-block-heading">aspx</h4>



<p class="wp-block-paragraph">Cree una nueva página aspx en el directorio raíz del sitio: <code>Register.aspx</code>, que usaremos como ejemplo de acceso.</p>



<p class="wp-block-paragraph">Dentro de <code>Themes/default</code> cree un archivo de plantilla <code>register.htm</code>. Este archivo actúa como plantilla NVelocity y contiene código HTML y sintaxis Velocity.</p>



<p class="wp-block-paragraph">Abra <code>Register.aspx</code>, <strong>conserve únicamente la directiva de página</strong> y elimine todo el resto del contenido HTML:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">%@</span> <span class="hljs-attr">Page</span> <span class="hljs-attr">Language</span>=<span class="hljs-string">"C#"</span> <span class="hljs-attr">AutoEventWireup</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">CodeBehind</span>=<span class="hljs-string">"Register.aspx.cs"</span> <span class="hljs-attr">Inherits</span>=<span class="hljs-string">"NVelocityStudy.Web.Register"</span> %&gt;</span></code></span></pre>


<p class="wp-block-paragraph">El archivo aspx ya no se encarga de renderizar la página, solo actúa como punto de entrada del controlador. El código trasero invoca NVelocity para cargar la plantilla <code>register.htm</code> y generar el contenido de salida.</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">Directorio</span> <span class="hljs-selector-tag">ra</span>í<span class="hljs-selector-tag">z</span> <span class="hljs-selector-tag">web</span>
├─ <span class="hljs-selector-tag">Register</span><span class="hljs-selector-class">.aspx</span>          # <span class="hljs-selector-tag">Punto</span> <span class="hljs-selector-tag">de</span> <span class="hljs-selector-tag">acceso</span>
├─ <span class="hljs-selector-tag">Register</span><span class="hljs-selector-class">.aspx</span><span class="hljs-selector-class">.cs</span>       # <span class="hljs-selector-tag">L</span>ó<span class="hljs-selector-tag">gica</span> <span class="hljs-selector-tag">del</span> <span class="hljs-selector-tag">c</span>ó<span class="hljs-selector-tag">digo</span> <span class="hljs-selector-tag">trasero</span>
└─ <span class="hljs-selector-tag">Themes</span>
    └─ <span class="hljs-selector-tag">default</span>
        └─ <span class="hljs-selector-tag">register</span><span class="hljs-selector-class">.htm</span>   # <span class="hljs-selector-tag">Plantilla</span> <span class="hljs-selector-tag">NVelocity</span></code></span></pre>


<p class="wp-block-paragraph">Luego escriba el código en <code>Register.aspx.cs</code> para indicar que se cargue la plantilla <code>register.htm</code> del tema activo, pasar el modelo de datos y generar finalmente el HTML.</p>



<p class="wp-block-paragraph">Si desea cambiar de tema, solo debe modificar la ruta del directorio de temas para cargar el archivo <code>register.htm</code> de la carpeta correspondiente.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="325" height="357" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15.png" alt="" class="wp-image-7083" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15.png 325w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15-273x300.png 273w" sizes="auto, (max-width: 325px) 100vw, 325px" /></figure>



<h4 class="wp-block-heading">aspx.cs</h4>



<p class="wp-block-paragraph">Abra el archivo de código trasero <code>Register.aspx.cs</code>. Escriba la lógica de renderizado de NVelocity dentro del método <strong>Page_Load</strong>, que se ejecutará para procesar la plantilla al cargarse la página.</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Web;
<span class="hljs-keyword">using</span> System.Web.UI;
<span class="hljs-keyword">using</span> System.Web.UI.WebControls;

<span class="hljs-keyword">namespace</span> <span class="hljs-title">NVelocityStudy.Web</span>
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">partial</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Register</span> : <span class="hljs-title">System</span>.<span class="hljs-title">Web</span>.<span class="hljs-title">UI</span>.<span class="hljs-title">Page</span>
    {
        <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Page_Load</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, EventArgs e</span>)</span>
        {
            <span class="hljs-comment">// Escriba aquí el código para cargar la plantilla y renderizar la página con NVelocity</span>
        }
    }
}</code></span></pre>


<p class="wp-block-paragraph">Añada el siguiente código dentro de Page_Load</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Page_Load</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, EventArgs e</span>)</span>
{
    <span class="hljs-comment">//Paso 1: Crear instancia de VelocityEngine</span>
    VelocityEngine ve = <span class="hljs-keyword">new</span> VelocityEngine();

    <span class="hljs-comment">//Paso 2: Inicializar configuración del motor</span>
    ExtendedProperties pros = <span class="hljs-keyword">new</span> ExtendedProperties();
    pros.AddProperty(RuntimeConstants.RESOURCE_LOADER, <span class="hljs-string">"file"</span>); <span class="hljs-comment">// Cargar plantillas desde archivos</span>
    pros.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Server.MapPath(<span class="hljs-string">@""</span>)); <span class="hljs-comment">// Directorio raíz de plantillas</span>
    ve.Init(pros); <span class="hljs-comment">// Inicializar motor con la configuración</span>

    <span class="hljs-comment">//Paso 3: Leer archivo de plantilla</span>
    Template template = ve.GetTemplate(<span class="hljs-string">"themes/default/register.htm"</span>);

    <span class="hljs-comment">//Paso 4: Crear contexto y pasar variables a la plantilla</span>
    IContext context = <span class="hljs-keyword">new</span> VelocityContext();
    context.Put(<span class="hljs-string">"websiteName"</span>, <span class="hljs-string">"FoxDevelop"</span>);
    context.Put(<span class="hljs-string">"domainName"</span>, <span class="hljs-string">"foxdevelop.com"</span>);

    <span class="hljs-comment">//Paso 5: Combinar plantilla y datos para renderizar HTML</span>
    StringWriter writer = <span class="hljs-keyword">new</span> StringWriter();
    template.Merge(context, writer); <span class="hljs-comment">// El resultado renderizado se guarda en writer</span>

    <span class="hljs-comment">//Paso 6: Enviar contenido al navegador</span>
    Response.Write(writer.ToString().Replace(<span class="hljs-string">"\r\n"</span>, <span class="hljs-string">"&lt;br/&gt;"</span>));
}</code></span></pre>


<p class="wp-block-paragraph">Este código lee el archivo HTML de plantilla, crea variables y sustituye los marcadores que aparecen en el HTML por sus valores correspondientes.</p>



<ol class="wp-block-list">
<li><strong>Instanciar VelocityEngine</strong>: Objeto motor independiente, distinto a la llamada estándar global <code>Velocity.Init()</code>. Permite usar múltiples configuraciones separadas.</li>



<li><strong>Inicialización y configuración del motor</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>RESOURCE_LOADER=file</code>: Especifica que las plantillas se cargan desde archivos locales;</li>



<li><code>FILE_RESOURCE_LOADER_PATH</code>: Define el directorio raíz donde se buscan las plantillas;</li>



<li><code>ve.Init(pros)</code>: Carga la configuración y finaliza la inicialización.</li>
</ul>



<ol start="3" class="wp-block-list">
<li><strong>Cargar plantilla con <code>GetTemplate()</code></strong>: Lee el archivo <code>themes/default/register.htm</code> tomando como base el directorio raíz configurado.</li>



<li><strong>Contexto de datos VelocityContext</strong>: Con <code>context.Put(clave, valor)</code> se envían variables C# a la plantilla. Dentro del archivo htm accede a ellas con <code>$websiteName</code> y <code>$domainName</code>.</li>



<li><strong>Renderizado Merge de plantillas</strong>: <code>template.Merge(contexto, flujoSalida)</code> inserta las variables en la plantilla y genera una cadena HTML completa. Se usa <code>StringWriter</code> para recibir el texto renderizado.</li>



<li><strong>Salida mediante Response</strong>: Envía el HTML final al navegador. <code>Replace("\r\n","&lt;br/&gt;")</code> convierte los saltos de línea del código fuente en etiquetas HTML de salto de línea.</li>
</ol>



<h4 class="wp-block-heading">Plantilla htm</h4>



<p class="wp-block-paragraph">Modifique el archivo <code>register.htm</code> dentro del directorio de temas</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span> <span class="hljs-meta-keyword">PUBLIC</span> <span class="hljs-meta-string">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span class="hljs-meta-string">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/1999/xhtml"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    Sitio web: $websiteName <span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
    Dominio: $domainName
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">Las dos expresiones con $xxxxxxx son los marcadores de las variables definidas en Page_Load, y serán sustituidos por sus valores durante el renderizado.</p>



<ol class="wp-block-list">
<li><strong>Identificador de variable <code>$nombreVariable</code></strong> <code>$websiteName</code> y <code>$domainName</code> corresponden a la sintaxis VTL de NVelocity. Se asignan valores en el código con <code>context.Put("websiteName", "FoxDevelop")</code> y el motor los reemplaza automáticamente al renderizar:</li>
</ol>



<ul class="wp-block-list">
<li><code>$websiteName</code> → <code>FoxDevelop</code></li>



<li><code>$domainName</code> → <code>foxdevelop.com</code></li>
</ul>



<p class="wp-block-paragraph">Resultado de ejecución</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">Sitio</span> <span class="hljs-selector-tag">web</span>: <span class="hljs-selector-tag">FoxDevelop</span>
<span class="hljs-selector-tag">Dominio</span>: <span class="hljs-selector-tag">foxdevelop</span><span class="hljs-selector-class">.com</span></code></span></pre>


<p class="wp-block-paragraph">Introducción a NVelocity</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/es/2026/08/01/introduccion-a-nvelocity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
