<?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-tw/category/c-zh-tw/c-%e7%a8%8b%e5%bc%8f%e5%ba%ab/nvelocity-%e6%95%99%e5%ad%b8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>獨立軟體開發工作室</description>
	<lastBuildDate>Fri, 14 Aug 2026 03:49:45 +0000</lastBuildDate>
	<language>zh-TW</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-tw/2026/08/14/%e8%bd%89%e7%be%a9%e8%88%87if%e5%88%a4%e6%96%b7/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%bd%89%e7%be%a9%e8%88%87if%e5%88%a4%e6%96%b7/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:49:45 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8526</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">轉義與if判斷</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%bd%89%e7%be%a9%e8%88%87if%e5%88%a4%e6%96%b7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>擴充方法</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e6%93%b4%e5%85%85%e6%96%b9%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e6%93%b4%e5%85%85%e6%96%b9%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:44:30 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8510</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>屬性與方法的區別</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-tw/2026/08/14/%e6%93%b4%e5%85%85%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>變數邊界補充說明</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%ae%8a%e6%95%b8%e9%82%8a%e7%95%8c%e8%a3%9c%e5%85%85%e8%aa%aa%e6%98%8e/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%ae%8a%e6%95%b8%e9%82%8a%e7%95%8c%e8%a3%9c%e5%85%85%e8%aa%aa%e6%98%8e/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:31:08 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8494</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-tw/2026/08/14/%e8%ae%8a%e6%95%b8%e9%82%8a%e7%95%8c%e8%a3%9c%e5%85%85%e8%aa%aa%e6%98%8e/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>遍歷集合</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e9%81%8d%e6%ad%b7%e9%9b%86%e5%90%88/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e9%81%8d%e6%ad%b7%e9%9b%86%e5%90%88/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:16:10 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8478</guid>

					<description><![CDATA[Velocity #foreach 遍歷集合與物件 一、遍歷 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Velocity #foreach 遍歷集合與物件</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-tw/2026/08/14/%e9%81%8d%e6%ad%b7%e9%9b%86%e5%90%88/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>註釋</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%a8%bb%e9%87%8b/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e8%a8%bb%e9%87%8b/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:10:06 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8462</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-tw/2026/08/14/%e8%a8%bb%e9%87%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>模板複用</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e6%a8%a1%e6%9d%bf%e8%a4%87%e7%94%a8/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e6%a8%a1%e6%9d%bf%e8%a4%87%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:41:52 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8446</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-tw/2026/08/14/%e6%a8%a1%e6%9d%bf%e8%a4%87%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>在模板內設定變數</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e5%9c%a8%e6%a8%a1%e6%9d%bf%e5%85%a7%e8%a8%ad%e5%ae%9a%e8%ae%8a%e6%95%b8/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e5%9c%a8%e6%a8%a1%e6%9d%bf%e5%85%a7%e8%a8%ad%e5%ae%9a%e8%ae%8a%e6%95%b8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:32:05 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8429</guid>

					<description><![CDATA[前面學習到的變數，都是在 C# 後台程式碼當中宣告，再於模板 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前面學習到的變數，都是在 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-tw/2026/08/14/%e5%9c%a8%e6%a8%a1%e6%9d%bf%e5%85%a7%e8%a8%ad%e5%ae%9a%e8%ae%8a%e6%95%b8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>基礎模板語法</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/14/%e5%9f%ba%e7%a4%8e%e6%a8%a1%e6%9d%bf%e8%aa%9e%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/14/%e5%9f%ba%e7%a4%8e%e6%a8%a1%e6%9d%bf%e8%aa%9e%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:23:23 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8413</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">預設行為：變數不存在時，頁面直接輸出原始<code>$變數名稱</code>文字<br><code>$!變數名稱</code>：變數不存在或是null時，輸出空白，不會印出$符號</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-tw/2026/08/14/%e5%9f%ba%e7%a4%8e%e6%a8%a1%e6%9d%bf%e8%aa%9e%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NVelocity介紹</title>
		<link>https://www.foxdevelop.com/zh-tw/2026/08/01/nvelocity%e4%bb%8b%e7%b4%b9/</link>
					<comments>https://www.foxdevelop.com/zh-tw/2026/08/01/nvelocity%e4%bb%8b%e7%b4%b9/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 12:40:43 +0000</pubDate>
				<category><![CDATA[NVelocity 教學]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7125</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">使用 Visual Studio 開啟 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">接著將 NVelocity.dll 匯入其他 ASP.NET 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">在網站根目錄建立新的 <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">在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">//第一步 建立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模板檔、建立變數，用來置換模板內的佔位符</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 就是Page_Load建立變數的佔位符，渲染過程會自動替換成對應內容。</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">NVelocity介紹</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh-tw/2026/08/01/nvelocity%e4%bb%8b%e7%b4%b9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
