<?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>NVelocity 教程 &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/zh/category/c-zh/c-%e5%ba%93/nvelocity-%e6%95%99%e7%a8%8b/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>独立软件开发工作室</description>
	<lastBuildDate>Fri, 14 Aug 2026 03:15:05 +0000</lastBuildDate>
	<language>zh-Hans</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>NVelocity 教程 &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>转义和if判断</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e8%bd%ac%e4%b9%89%e5%92%8cif%e5%88%a4%e6%96%ad/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e8%bd%ac%e4%b9%89%e5%92%8cif%e5%88%a4%e6%96%ad/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 09:44:52 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7111</guid>

					<description><![CDATA[反斜杠转义 + #if 判断语法 一、反斜杠 \ 转义规则  ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">反斜杠转义 + #if 判断语法</p>



<h4 class="wp-block-heading">一、反斜杠 \ 转义规则</h4>



<p class="wp-block-paragraph">预设变量：<code>#set($dog = "woof woof")</code></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>VTL代码</th><th>渲染输出</th><th>原理说明</th></tr></thead><tbody><tr><td><code>$dog</code></td><td>woof woof</td><td>正常解析变量</td></tr><tr><td><code>\$dog</code></td><td>$dog</td><td><strong>单个反斜杠</strong>：转义紧随其后的<code>$</code>，取消变量解析，原样打印<code>$</code></td></tr><tr><td><code>\\$dog</code></td><td>\woof woof</td><td>第一个<code>\</code>转义第二个<code>\</code> → 输出<code>\</code>；<br>剩下<code>$dog</code>正常解析变量</td></tr><tr><td><code>\\\$dog</code></td><td>\$dog</td><td><code>\\</code>输出<code>\</code>，<code>\$</code>输出<code>$</code></td></tr><tr><td><code>\\\\$dog</code></td><td>\woof woof</td><td><code>\\</code>输出<code>\</code>，<code>\\</code>输出<code>\</code>；<br><code>$dog</code>解析变量</td></tr></tbody></table></figure>



<ol class="wp-block-list">
<li>Velocity变量名<strong>必须字母开头</strong>，<code>$10.0</code> 不会识别为变量，直接原样输出，所以文本里写<code>微软$10.0美元</code>无需额外转义；</li>



<li><strong>连续反斜杠两两抵消</strong>；只有<code>\$</code>组合具备转义美元符号的能力；</li>



<li>如果页面需要原样展示<code>$变量名</code>，标准写法：<code>\$dog</code>。</li>
</ol>



<h4 class="wp-block-heading">二、#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;你是儿童&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;18)</span>
    &lt;h1&gt;你是少年&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;35)</span>
    &lt;h1&gt;你是青年&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;60)</span>
    &lt;h1&gt;你是中年&lt;/h1&gt;
<span class="hljs-comment">#else</span>
    &lt;h1&gt;你是老年&lt;/h1&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<h5 class="wp-block-heading">执行结果</h5>



<p class="wp-block-paragraph"><code>$ages=22</code>，满足 <code>22 &lt; 35</code> → 输出：<code>&lt;h1&gt;你是青年&lt;/h1&gt;</code></p>



<h5 class="wp-block-heading">注意</h5>



<ol class="wp-block-list">
<li>结尾<strong>必须写<code>#end</code></strong>闭合判断块，缺少会直接报错；</li>



<li>关键字：<code>#elseif</code>（<strong>不要分开写成 #else if</strong>，这是错误写法）；</li>



<li>条件支持：<code>&lt; > &lt;= >= == != &amp;&amp; ||</code> 等运算符；</li>



<li>匹配逻辑：从上往下依次判断，命中第一条满足条件分支后，后续分支不再执行。</li>
</ol>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e8%bd%ac%e4%b9%89%e5%92%8cif%e5%88%a4%e6%96%ad/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>扩展方法</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 09:29:37 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7107</guid>

					<description><![CDATA[一、后端 Person 实体代码（C#） cs后端代码中设置 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h4 class="wp-block-heading">一、后端 Person 实体代码（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">//无参构造</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">//带参构造</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">//无参实例方法</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">//多参数实例方法</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">cs后端代码中设置对象变量</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">二、VTL模板代码 &amp; 渲染说明</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">方法的调用&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>调用对象<strong>无参方法</strong> <code>getMyName()</code></li>



<li>返回 <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;" /> Velocity 调用无参方法：括号<code>()</code>可以省略，<code>$pTest.getMyName</code> 等价 <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>调用带两个字符串参数的方法</li>



<li>VTL 会先解析 <code>$a</code>、<code>$b</code>，传入实参 <code>"hello"</code>、<code>"foxdevelop"</code></li>



<li>返回拼接结果：<code>hellofoxdevelop</code></li>
</ul>



<h4 class="wp-block-heading">总结</h4>



<ol class="wp-block-list">
<li><strong>方法名大小写严格匹配</strong><br>C# <code>getMyName()</code> ≠ <code>GetMyName()</code>，模板必须和代码写法一致。</li>



<li><strong>传参直接写变量</strong><br>不需要额外引号，<code>$pTest.JoinStr($a,$b)</code> 正确；不要写成 <code>$pTest.JoinStr("$a","$b")</code>（会传递字面字符串&#8221;$a&#8221;）</li>



<li><strong>属性 vs 方法区分</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>$pTest.Name</code> → 访问属性（getter）</li>



<li><code>$pTest.getMyName()</code> → 调用方法</li>
</ul>



<ol class="wp-block-list">
<li><strong>返回值自动输出</strong><br>模板里直接写 <code>$对象.方法()</code>，Velocity会自动打印方法返回值；如果不需要输出，用 <code>#set</code> 接收结果：</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">三、最终页面渲染输出</h4>


<pre class="wp-block-code"><span><code class="hljs">方法的调用
Tom;

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


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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>变量边界补充</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e5%8f%98%e9%87%8f%e8%be%b9%e7%95%8c%e8%a1%a5%e5%85%85/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e5%8f%98%e9%87%8f%e8%be%b9%e7%95%8c%e8%a1%a5%e5%85%85/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 09:25:58 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7104</guid>

					<description><![CDATA[变量预设：#set ($valok = "hello fox ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">变量预设：<code>#set ($valok = "hello foxdevelop")</code></p>



<h4 class="wp-block-heading">变量边界 <code>${}</code> 与 <code>.</code> 访问辨析</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>代码</th><th>渲染结果</th><th>原理说明</th></tr></thead><tbody><tr><td><code>$valok</code></td><td>hello <code>foxdevelop</code></td><td>基础变量输出</td></tr><tr><td><code>$valok.</code>com</td><td>hello <code>foxdevelop</code>.com</td><td>Velocity尝试调用<code>valok</code>对象的<code>cn</code>属性/方法；字符串无<code>cn</code>方法，<strong>原样输出变量+后缀</strong></td></tr><tr><td><code>${valok}.com</code></td><td>hello <code>foxdevelop</code>.com</td><td><code>{}</code>锁定变量边界，变量<code>valok</code>渲染完成后拼接文字<code>.com</code>（推荐拼接写法）</td></tr><tr><td><code>$!valok.com</code></td><td>hello<code>foxdevelop</code>.com</td><td><code>$!</code>静默引用：变量存在等价<code>$valok</code>；变量不存在输出空字符串，不会原样显示<code>$xxx</code></td></tr><tr><td><code>${valok.com}</code></td><td><strong>空白</strong></td><td>尝试读取<code>valok.com</code>属性，字符串没有<code>com</code>方法/属性，变量不存在；如果写成<code>$!{valok.com}</code>才会输出空</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;" /> 变量 + 后缀拼接<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;" /> 访问对象valok下的cn属性</p>



<h4 class="wp-block-heading">单引号 / 双引号 &amp; 变量粘连</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>代码</th><th>渲染结果</th><th>原理说明</th></tr></thead><tbody><tr><td><code>what$valok</code></td><td>whathello <code>foxdevelop</code></td><td>直接拼接，Velocity自动识别变量边界</td></tr><tr><td><code>what$"valok"</code></td><td>what$&#8221;valok&#8221;</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;" />语法错误写法，<code>$</code>后面不能直接跟引号，无法识别变量</td></tr><tr><td><code>what"$valok"</code></td><td>what&#8221;hello <code>foxdevelop</code>&#8220;</td><td>引号只是普通文本，模板内的引号不触发字符串解析，变量正常渲染</td></tr><tr><td><code>what'$valok'</code></td><td>what&#8217;hello <code>foxdevelop</code>&#8216;</td><td>同上，单引号属于普通文本字符</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;" />无法识别变量！Velocity把<code>valokwhat</code>整体当成变量名，找不到该变量，原样输出</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;" />大括号锁定边界，完美解决变量和文字粘连问题</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">总结</h4>



<ol class="wp-block-list">
<li><strong>变量粘连场景务必使用 <code>${变量名}</code></strong><br>错误：<code>$valokwhat</code>；正确：<code>${valok}what</code></li>



<li><strong>拼接后缀文本：<code>${valok}.cn</code> 不要写成 <code>${valok.cn}</code></strong></li>



<li><strong><code>$!变量</code> 静默引用</strong>：变量不存在时输出空白，不会打印<code>$xxx</code></li>



<li><strong>模板HTML里的单/双引号只是普通字符</strong>；<strong>只有#set赋值内部</strong>才区分单引号（不解析变量）、双引号（解析变量）</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($a = "$valok") // 双引号：解析变量，a=hello bamn</span>
<span class="hljs-comment">#set($a = '$valok') // 单引号：不解析变量，a=$valok</span></code></span></pre>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e5%8f%98%e9%87%8f%e8%be%b9%e7%95%8c%e8%a1%a5%e5%85%85/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>遍历集合</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e9%81%8d%e5%8e%86%e9%9b%86%e5%90%88/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e9%81%8d%e5%8e%86%e9%9b%86%e5%90%88/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 09:14:33 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7101</guid>

					<description><![CDATA[Velocity #foreach遍历集合 &#38; 对象 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Velocity #foreach遍历集合 &amp; 对象</p>



<h4 class="wp-block-heading">一、遍历字符串List</h4>



<h5 class="wp-block-heading">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">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">执行效果：循环取出列表每一个字符串，换行输出。</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">语法说明</h5>



<p class="wp-block-paragraph"><code>#foreach(循环变量 in 集合)</code> 开启循环，<code>#end</code> 闭合循环。</p>



<h4 class="wp-block-heading">二、遍历自定义实体类 List</h4>



<h5 class="wp-block-heading">1. 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. 后端封装List</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.模板访问属性写法</h5>



<p class="wp-block-paragraph">模板代码：</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>会读取不到数据！报错/空白</strong></p>



<h4 class="wp-block-heading">根本原理</h4>



<p class="wp-block-paragraph">Velocity 访问对象属性规则：<br><code>$per.xxx</code> 会自动寻找 <strong>公共Get方法 <code>GetXxx()</code></strong></p>



<ul class="wp-block-list">
<li><code>$per.name</code> → 尝试调用 <code>per.getName()</code></li>



<li><code>$per.age</code> → 尝试调用 <code>per.getAge()</code></li>
</ul>



<p class="wp-block-paragraph">你的实体：</p>



<ul class="wp-block-list">
<li>私有字段：<code>name</code>、<code>age</code></li>



<li><strong>公共属性大写开头：<code>Name</code>、<code>Age</code></strong>，对应方法 <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;" />正确模板写法：</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">补充：C#规范属性首字母大写；Java实体属性一般小写，这是新手最容易踩的大小写陷阱。</p>
</blockquote>



<h4 class="wp-block-heading">三、#foreach内置常用变量</h4>



<p class="wp-block-paragraph">循环内部自带变量，可以直接使用：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>变量</th><th>作用</th></tr></thead><tbody><tr><td><code>$foreach.index</code></td><td>当前索引，<strong>从0开始</strong></td></tr><tr><td><code>$foreach.count</code></td><td>当前序号，<strong>从1开始</strong></td></tr><tr><td><code>$foreach.first</code></td><td>是否第一条数据（布尔值）</td></tr><tr><td><code>$foreach.last</code></td><td>是否最后一条数据（布尔值）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">示例：</p>


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


<h4 class="wp-block-heading">四、表格显示</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">总结</h4>



<ol class="wp-block-list">
<li><code>#foreach(变量 in 集合)</code> + <code>#end</code> 是Velocity标准循环；</li>



<li>遍历普通List，直接输出<code>$变量</code>；</li>



<li>遍历实体对象：<code>$对象.属性名</code> <strong>匹配公共属性名大小写</strong>，不要访问私有字段；</li>



<li>C#实体属性建议统一大写首字母，模板保持一致书写；</li>



<li>如果出现数据空白，优先检查<strong>属性大小写、是否存在get访问器</strong>。</li>
</ol>



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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e9%81%8d%e5%8e%86%e9%9b%86%e5%90%88/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>注释</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e6%b3%a8%e9%87%8a/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e6%b3%a8%e9%87%8a/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 09:04:02 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7097</guid>

					<description><![CDATA[一、模板注释区分 写法 类型 特点 &#60;!-- HTML ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">一、模板注释区分</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>写法</th><th>类型</th><th>特点</th></tr></thead><tbody><tr><td><code>&lt;!-- HTML注释 --&gt;</code></td><td>HTML原生注释</td><td><strong>会输出到最终网页源码</strong>，浏览器查看源代码能看到</td></tr><tr><td><code>## 单行注释</code></td><td>Velocity单行注释</td><td>仅引擎识别，<strong>不会输出到页面</strong>，生效至本行末尾</td></tr><tr><td><code>#* 多行注释内容 *#</code></td><td>Velocity多行注释</td><td>支持跨越多行，<strong>不会输出到页面</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">开发建议：业务说明代码注释优先使用<code>##</code> / <code>#* *#</code>，避免页面源码泄露注释信息。</p>
</blockquote>



<h3 class="wp-block-heading">二、变量命名规则</h3>



<p class="wp-block-paragraph">官方命名基础规则</p>



<ol class="wp-block-list">
<li>变量首字符<strong>必须是英文字母</strong>（a-z / A-Z）</li>



<li>后续字符允许：字母、数字<code>0-9</code>、下划线<code>_</code>、减号<code>-</code></li>
</ol>



<h4 class="wp-block-heading">减号 <code>-</code> 存在运算符歧义</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">执行时会报截图错误：<code>Encountered "name" ... Was expecting one of:</code><br><strong>原因：Velocity把 <code>-</code> 识别为减法运算符！</strong><br>引擎解析逻辑：<code>$name - d</code>，误认为是变量<code>$name</code>减去变量<code>d</code>，语法直接冲突。</p>



<p class="wp-block-paragraph">两种解决方案：</p>



<ol class="wp-block-list">
<li><strong>推荐：改用下划线命名</strong>（无歧义，通用规范）</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>大括号限定变量边界</strong>（兼容带减号名称）</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">合法/非法示例对照</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;" />合法</span>
<span class="hljs-comment">#set($name_d = "下划线")</span>
<span class="hljs-comment">#set($name12d = "字母开头+数字")</span>
<span class="hljs-comment">#set(${name-1_2d} = "带减号必须加大括号")</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;" />直接写减号，不加大括号 → 解析报错</span>
<span class="hljs-comment">#set($name-d = "报错！")</span>
<span class="hljs-comment">#set($name-1_2d = "报错！")</span></code></span></pre>


<h3 class="wp-block-heading">三、#set 语法书写规范</h3>



<p class="wp-block-paragraph">标准写法（括号前后空格可灵活，建议统一风格）</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($变量名 = "值")</span></code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">字符串必须使用双引号包裹；等号左右建议保留空格，可读性更好。</p>
</blockquote>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e6%b3%a8%e9%87%8a/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>模板复用</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e5%a4%8d%e7%94%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e5%a4%8d%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 08:46:56 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7094</guid>

					<description><![CDATA[一、核心作用 Velocity 模板引擎通过 #includ ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">一、核心作用</h3>



<p class="wp-block-paragraph">Velocity 模板引擎通过 <code>#include</code> / <code>#parse</code> 实现<strong>模板复用</strong>。<br>网页通用部分（页面头部导航<code>_head.htm</code>、底部版权<code>_footer.htm</code>）抽离为独立子模板，在页面中引入，避免多处重复编写HTML。</p>



<h3 class="wp-block-heading">二、两者核心区别</h3>



<h4 class="wp-block-heading">1. <code>#include("文件路径")</code></h4>



<p class="wp-block-paragraph"><strong>单纯把文件原文原样输出，不会解析子模板中的Velocity变量（<code>$!{xxx}</code>）</strong></p>



<ul class="wp-block-list">
<li>子模板内的 <code>$!{testinclude}</code> 不会被渲染，直接原样输出字符串<code>$!{testinclude}</code></li>



<li>支持一次性传入<strong>多个文件</strong>：<code>#include("a.htm","b.htm")</code></li>



<li>适合：纯静态HTML、不含任何VTL变量的静态片段</li>
</ul>



<h4 class="wp-block-heading">2. <code>#parse("文件路径")</code></h4>



<p class="wp-block-paragraph"><strong>引入子模板并完整解析Velocity语法</strong>，父模板传递的变量可以在子模板中正常渲染</p>



<ul class="wp-block-list">
<li>子模板里的 <code>$!{testinclude}</code> 会读取上下文变量，替换成后端传入的值</li>



<li><strong>只能接收单个文件路径</strong>，不支持同时引入多个文件</li>



<li>适合：头部、底部这类<strong>包含变量</strong>的公共模板（页面标题、版权动态信息等）</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">对应你截图笔记原文：<br><code>#include只是单纯的把子模板的代码加入到主模板里面，而不会解析，而#parse则会解析</code></p>
</blockquote>



<h3 class="wp-block-heading">三、案例演示</h3>



<h4 class="wp-block-heading">1. 后端代码（.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">"子模板的文字："</span>);</code></span></pre>


<h4 class="wp-block-heading">2. 子模板 <code>_footer.htm</code> 内容</h4>


<pre class="wp-block-code"><span><code class="hljs">版权信息 $!{testinclude}</code></span></pre>


<h5 class="wp-block-heading">场景① 使用 <code>#include("./themes/default/_footer.htm")</code></h5>



<p class="wp-block-paragraph">页面输出结果：</p>


<pre class="wp-block-code"><span><code class="hljs">版权信息 $!{testinclude}</code></span></pre>


<p class="wp-block-paragraph">变量没有被解析，原样打印占位符。</p>



<h5 class="wp-block-heading">场景② 使用 <code>#parse("./themes/default/_footer.htm")</code></h5>



<p class="wp-block-paragraph">页面输出结果：</p>


<pre class="wp-block-code"><span><code class="hljs">版权信息 子模板的文字：</code></span></pre>


<p class="wp-block-paragraph">变量成功渲染，这也是项目中头部、底部通用模板<strong>优先使用#parse</strong>的原因。</p>



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



<h3 class="wp-block-heading">四、使用场景推荐</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>指令</th><th>适用场景</th></tr></thead><tbody><tr><td><code>#include</code></td><td>静态资源、纯文本、静态HTML片段，不需要变量渲染</td></tr><tr><td><code>#parse</code></td><td>公共头部、底部、侧边栏；子模板内存在<code>$变量</code>、<code>#if</code>等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;" /> 开发规范：<br>页面导航、底部版权这类大概率需要动态变量的公共组件，统一使用<code>#parse</code>；纯静态文本、样式片段使用<code>#include</code>。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e5%a4%8d%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>模板中设置变量</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e4%b8%ad%e8%ae%be%e7%bd%ae%e5%8f%98%e9%87%8f/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e4%b8%ad%e8%ae%be%e7%bd%ae%e5%8f%98%e9%87%8f/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 08:36:53 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7090</guid>

					<description><![CDATA[前面学到的变量都是在cs后台的C#代码中设置变量的，然后在模 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前面学到的变量都是在cs后台的C#代码中设置变量的，然后在模板中使用，但是事实上，我们可以直接在模板中通过set指令来设置变量的。</p>



<h3 class="wp-block-heading">一、变量定义<code>#set()</code></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">两种方式定义变量：<br>方式1：后台C#/Java代码预先定义变量，模板页面读取；<br>方式2：<strong>直接在模板内部使用 <code>#set()</code> 定义变量</strong>（本课重点）</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(变量 = 值)</code>，支持字符串、数字、数组、对象属性、其他变量赋值</li>



<li>弱类型，不需要声明变量类型</li>
</ul>



<h3 class="wp-block-heading">二、变量渲染两种写法和规范</h3>



<h4 class="wp-block-heading">1. 基础形式</h4>



<ul class="wp-block-list">
<li><code>$name</code>：变量不存在时，原样输出字符串 <code>$name</code></li>



<li><code>$!name</code>：<strong>静默渲染</strong>，变量不存在时输出空白（推荐避免页面出现<code>$xxx</code>文本）</li>



<li> 推荐标准写法：<strong><code>${name}</code></strong>（大括号隔离变量边界）</li>
</ul>



<h4 class="wp-block-heading">2. 边界问题示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name = "hello")</span>
$namehello     × 引擎会识别变量名为 $namehello，找不到变量
${name}hello   √ 正确，引擎识别变量$name，后面拼接hello文本</code></span></pre>


<h3 class="wp-block-heading">三、单行注释 <code>##</code></h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## 这里表示注释，最终不会显示</span>
<span class="hljs-comment">#set($name = "test") ## 行尾注释也支持</span></code></span></pre>


<ol class="wp-block-list">
<li>注释内容<strong>不会输出到最终渲染页面</strong>；</li>



<li>浏览器查看网页源代码，<strong>也看不到注释文本</strong>（模板引擎渲染阶段直接丢弃注释）。</li>
</ol>



<h3 class="wp-block-heading">四、#set 支持多种赋值类型</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## 字符串赋值</span>
<span class="hljs-comment">#set($name = "hello world")</span>

<span class="hljs-comment">## 将变量赋值给另一个变量</span>
<span class="hljs-comment">#set($obj= $name)</span>

<span class="hljs-comment">## 对象属性赋值</span>
<span class="hljs-comment">#set($obj.Friend = "monica")</span>
<span class="hljs-comment">#set($obj.Blame = $whitehouse.Leak)</span>

<span class="hljs-comment">## 调用方法，将返回值赋值</span>
<span class="hljs-comment">#set($obj.Plan = $spindoctor.weave($web))</span>

<span class="hljs-comment">## 数字赋值</span>
<span class="hljs-comment">#set($obj.Number = 123)</span>

<span class="hljs-comment">## 数组赋值</span>
<span class="hljs-comment">#set($obj.Say = &#91;"Not", $my, "fault"])</span></code></span></pre>


<h3 class="wp-block-heading">五、变量不存在的特殊规则</h3>


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


<p class="wp-block-paragraph">当模板引擎找不到该变量时：</p>



<ul class="wp-block-list">
<li>普通写法 <code>$sadfsdfsd</code>：直接原样输出文本 <code>$sadfsdfsd</code></li>



<li>如果写成 <code>$!sadfsdfsd</code>：变量不存在，输出空白字符串</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e6%a8%a1%e6%9d%bf%e4%b8%ad%e8%ae%be%e7%bd%ae%e5%8f%98%e9%87%8f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>基本语法</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 08:18:05 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7086</guid>

					<description><![CDATA[一、传递实体对象给模板 1. PageInfo实体类 之前我 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">一、传递实体对象给模板</h3>



<h4 class="wp-block-heading">1. PageInfo实体类</h4>



<p class="wp-block-paragraph">之前我们都是用单个字符串传递，但是这样效率太低，而且代码维护也不方便，我们可以通过封装实体对象的方式，会使得代码更具直观</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>私有字段<code>IsShowImage</code>，对外暴露<strong>属性<code>IsShowImage1</code></strong></li>



<li>模板中访问：<code>$info.IsShowImage1</code></li>
</ul>



<h4 class="wp-block-heading">2. 填充上下文数据</h4>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-comment">//模板上下文容器</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">//将对象pi以键名info存入上下文</span>
context.Put(<span class="hljs-string">"info"</span>,pi);

<span class="hljs-comment">//字符串变量示例</span>
context.Put(<span class="hljs-string">"infotitle"</span>,<span class="hljs-string">"你好"</span>);</code></span></pre>


<p class="wp-block-paragraph"><code>context.Put("键名",数据)</code>：把数据交给模板，模板通过<code>$键名</code>获取。</p>



<h3 class="wp-block-heading">二、Velocity模板核心语法</h3>



<h4 class="wp-block-heading">1. 关键字标识 <code>#</code></h4>



<p class="wp-block-paragraph">以<code>#</code>开头为指令，常见：<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">条件渲染示例：</p>



<p class="wp-block-paragraph">请实现准备两张图片，放到网站根目录下的Contents/Images里面，通过设置IsShowImage1可以显示不同的图片</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">逻辑：当<code>IsShowImage1=true</code>展示a.gif，否则展示b.gif</p>



<h4 class="wp-block-heading">2. 变量标识 <code>$</code></h4>



<ul class="wp-block-list">
<li><code>$变量名</code>：输出变量值</li>



<li><code>${变量名}</code>：<strong>界定变量边界</strong>（重点！）</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">场景：变量后紧跟英文，引擎无法区分变量名范围</p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-php">错误写法：$infotitlefoxdevelop.com
引擎会识别成变量名叫 infotitlefoxdevelop，不存在！

正确写法：${infotitle}foxdevelop.com
引擎识别 infotitle 为变量，后面拼接字符串foxdevelop.com</code></span></pre>


<h4 class="wp-block-heading">3. 静默符 <code>!</code> → <code>$!变量名</code></h4>



<p class="wp-block-paragraph">默认行为：如果变量不存在，页面<strong>原样输出<code>$变量名</code>文本</strong><br><code>$!变量名</code>：变量不存在或者为null时，<strong>输出空白，不打印$符号</strong></p>



<p class="wp-block-paragraph">对比示例：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>写法</th><th>变量存在(值=&#8221;你好&#8221;)</th><th>变量不存在</th></tr></thead><tbody><tr><td><code>$infotitle</code></td><td>你好</td><td><code>$infotitle</code></td></tr><tr><td><code>$!infotitle</code></td><td>你好</td><td>（空白，什么都不显示）</td></tr><tr><td><code>${infotitle}</code></td><td>你好</td><td><code>${infotitle}</code></td></tr><tr><td><code>$!{infotitle}</code></td><td>你好</td><td>空白</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">完整测试代码：</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">总结</h3>



<ol class="wp-block-list">
<li>变量后面拼接文字，务必使用 <code>${变量}</code> 包裹</li>



<li>生产环境优先使用 <code>$!{变量名}</code>，防止变量为空时页面打印原始<code>$xxx</code>破坏布局</li>



<li><code>#if</code> 判断布尔属性，直接写<code>#if($info.IsShowImage1)</code>，不需要额外<code>==true</code></li>
</ol>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NVelocity介绍</title>
		<link>https://www.foxdevelop.com/zh/2026/08/01/nvelocity%e4%bb%8b%e7%bb%8d/</link>
					<comments>https://www.foxdevelop.com/zh/2026/08/01/nvelocity%e4%bb%8b%e7%bb%8d/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 07:09:01 +0000</pubDate>
				<category><![CDATA[NVelocity 教程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7080</guid>

					<description><![CDATA[.NET 平台模板引擎，是 Java 平台 Velocity ...]]></description>
										<content:encoded><![CDATA[<p>.NET 平台模板引擎，是 Java 平台 Velocity 的 .NET 移植版本。</p>


<h4 class="wp-block-heading">介绍</h4>



<p class="wp-block-paragraph">ASP.NET 项目中使用广泛；<br>ASP.NET MVC 配套有 Razor 模板；</p>



<p class="wp-block-paragraph">传统 <code>.aspx</code> 页面项目想要引入 MVC 模式时，很多开发者选用 NVelocity。</p>



<p class="wp-block-paragraph">NVelocity 早已停止维护，仅用于老旧 .NET Framework 历史项目；新项目优先使用 Razor、Handlebars.NET 等现代模板引擎。</p>



<p class="wp-block-paragraph">版本与 .NET Framework 对应关系</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>.NET Framework 版本</th><th>NVelocity 版本</th></tr></thead><tbody><tr><td>.NET 4.0</td><td>1.0（官方最新版）</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 是老牌 Java 模板引擎，语法简洁，使用 <code>#</code>、<code>$</code> 作为模板标记；NVelocity 完整移植这套语法；</p>



<h4 class="wp-block-heading">下载</h4>



<p class="wp-block-paragraph">官方最后一次更新是2018年，最新的版本是1.2.0</p>



<p class="wp-block-paragraph">读者可以到下面地址下载</p>



<p class="wp-block-paragraph">它是开源的，托管在GitHub <a href="https://github.com/castleproject/NVelocity/tree/master">castleproject/NVelocity: Castle&#8217;s NVelocity</a></p>



<p class="wp-block-paragraph">官方下载的不是编译好的dll，读者可以下载下来后，自己编译，或者直接把项目引入到你项目的解决方案中。</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">用vs打开sln</p>



<p class="wp-block-paragraph">最后一个版本是基于.NET Core 2.1的 建议读者可以把它升级到.NET 4.8</p>



<p class="wp-block-paragraph">编译后，在目录下面 就可以看到 dll</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">然后引入到其他asp.net web 项目中就可以。把上面的NVelocity.dll 引入到您的web项目中。</p>



<h4 class="wp-block-heading">引入项目</h4>



<p class="wp-block-paragraph">项目中引用程序集：NVelocity.dll<br>核心优势：基于该模板引擎，实现网站多模板切换（换肤）十分便捷</p>



<p class="wp-block-paragraph">在网站根目录创建文件夹：Themes，作为所有模板存放根目录<br>在 Themes 内部建立多个主题文件夹，例如：</p>



<p class="wp-block-paragraph">我们在网站根目录下面创建Themes文件夹，作为主题目录</p>



<h4 class="wp-block-heading">主题目录</h4>



<p class="wp-block-paragraph">然后创建一个default文件夹，作为  默认模板<br>后续可新增 Themes/blue、Themes/dark 等多套模板</p>


<pre class="wp-block-code"><span><code class="hljs language-php">网站根目录
└── Themes
    ├── <span class="hljs-keyword">default</span>      <span class="hljs-comment"># 默认主题模板文件</span>
    ├── dark         <span class="hljs-comment"># 深色主题模板文件</span>
    └── blue         <span class="hljs-comment"># 蓝色主题模板文件</span></code></span></pre>


<p class="wp-block-paragraph">运行时通过配置读取当前启用的主题名称，NVelocity 加载对应主题目录下的模板文件；<br>切换模板本质：修改配置指向不同主题文件夹，无需改动业务逻辑代码；<br>适合老旧 ASP.NET WebForm（aspx）项目实现前台页面换肤功能。</p>



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



<p class="wp-block-paragraph">新建一个aspx的页面 ，网站根目录新建 <code>Register.aspx</code>，作为演示页面访问。</p>



<p class="wp-block-paragraph">在 <code>Themes/default</code> 目录下新建模板文件：<code>register.htm</code>，它作为NVelocity 模板文件，存放 HTML 与 Velocity 模板语法</p>



<p class="wp-block-paragraph">打开 <code>Register.aspx</code>，<strong>仅保留页面指令</strong>，删除其余所有 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">aspx 不再负责渲染页面，仅充当控制器入口，由后台代码调用 NVelocity 加载 <code>register.htm</code> 模板输出内容。</p>


<pre class="wp-block-code"><span><code class="hljs language-css">网站根目录
├─ <span class="hljs-selector-tag">Register</span><span class="hljs-selector-class">.aspx</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">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">NVelocity</span>模板页面</code></span></pre>


<p class="wp-block-paragraph">后续在 <code>Register.aspx.cs</code> 编写代码，指定加载当前主题下的 <code>register.htm</code> 模板、传入数据模型，最终输出 HTML</p>



<p class="wp-block-paragraph">如果切换主题，只需要修改主题目录指向，加载对应主题文件夹内的 <code>register.htm</code></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">打开后台代码文件：<code>Register.aspx.cs</code> 在 <strong>Page_Load</strong> 方法内编写 NVelocity 渲染逻辑，页面加载时执行模板解析输出。</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">// 此处编写NVelocity加载模板、渲染页面的代码</span>
        }
    }
}</code></span></pre>


<p class="wp-block-paragraph">pageload中添加下面代码</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">//第一步 创建Velocity引擎实例 VelocityEngine</span>
    VelocityEngine ve = <span class="hljs-keyword">new</span> VelocityEngine();

    <span class="hljs-comment">//第二步 初始化引擎配置</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">// 文件方式加载模板</span>
    pros.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Server.MapPath(<span class="hljs-string">@""</span>)); <span class="hljs-comment">// 模板根目录</span>
    ve.Init(pros); <span class="hljs-comment">// 使用配置初始化引擎</span>

    <span class="hljs-comment">//第三步 读取模板文件</span>
    Template template = ve.GetTemplate(<span class="hljs-string">"themes/default/register.htm"</span>);

    <span class="hljs-comment">//第四步 创建上下文，向模板传递变量</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">//第五步 合并模板与数据，渲染HTML</span>
    StringWriter writer = <span class="hljs-keyword">new</span> StringWriter();
    template.Merge(context, writer); <span class="hljs-comment">//渲染结果存入writer</span>

    <span class="hljs-comment">//第六步 输出页面</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">这段代码，就是读取模板html文件，并且创建一些变量，用来替换html中的占位符</p>



<ol class="wp-block-list">
<li><strong>实例化 VelocityEngine</strong> 独立引擎对象，区别于全局静态<code>Velocity.Init()</code>，支持多套独立配置。</li>



<li><strong>引擎初始化与配置</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>RESOURCE_LOADER=file</code>：指定模板加载方式为本地文件；</li>



<li><code>FILE_RESOURCE_LOADER_PATH</code>：设置模板查找根路径；</li>



<li><code>ve.Init(pros)</code>：加载配置完成初始化。</li>
</ul>



<ol start="3" class="wp-block-list">
<li><strong>加载模板 <code>GetTemplate()</code></strong> 基于配置的根路径，读取 <code>themes/default/register.htm</code> 模板文件。</li>



<li><strong>VelocityContext 数据上下文</strong><code>context.Put(键, 值)</code>：把 C# 变量传入模板，在 htm 中使用<code>$websiteName</code>、<code>$domainName</code>取值。</li>



<li><strong>模板 Merge 渲染</strong><code>template.Merge(上下文, 输出流)</code>，将变量填充进模板，生成完整 HTML 字符串； 使用<code>StringWriter</code>接收渲染后的文本。</li>



<li><strong>Response 输出</strong> 把最终 HTML 发送浏览器；<code>Replace("\r\n","&lt;br/&gt;")</code>：将源码换行符转换为 HTML 换行标签。</li>
</ol>



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



<p class="wp-block-paragraph">修改主题目录中的<code>register.htm</code></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>
    网站：$websiteName <span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
    域名：$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">上面两个$xxxxxxx 就是pageload中创建的两个变量的占位符，渲染过程会替换成对应的值。</p>



<ol class="wp-block-list">
<li><strong>变量标识 <code>$变量名</code></strong> <code>$websiteName</code>、<code>$domainName</code> 是 NVelocity (VTL) 变量语法。 程序代码中 <code>context.Put("websiteName", "FoxDevelop")</code> 赋值，渲染时引擎自动替换：</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">运行效果</p>


<pre class="wp-block-code"><span><code class="hljs language-css">网站：<span class="hljs-selector-tag">FoxDevelop</span>
域名：<span class="hljs-selector-tag">foxdevelop</span><span class="hljs-selector-class">.com</span></code></span></pre>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/08/01/nvelocity%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
