3、有條件的控制數據的輸出
在輸出數據時,我們並不是簡單的輸出所有數據,而是要根據外部的許多條件組合獲取其中的部分數據。而對於這些外部條件,如果可固定的則我們可以在設計VT模版時將其寫入到標簽(建議是<vt:template>標簽)的屬性裡,這樣我們就能在程序代碼裡獲取到這些外部條件並加以處理數據。
例如博客園的新聞頻道裡右邊的“相關新聞”、“熱點新聞”兩欄數據,如下圖:
假設“相關新聞”裡獲取的新聞是屬於"relating”類型的新聞,而“熱點新聞”則是獲取屬於"hoting”類型的新聞,則我們可以設計其VT模版如下:
<div class="side_block">
<h3 class="title_blue">相關新聞</h3>
<vt:template name="topnews" type="relating" file="cnblogs_newsdata.Html" />
< /div>
< div class="side_block">
<h3 class="title_yellow">熱點新聞</h3>
<vt:template name="topnews" type="hoting" file="cnblogs_newsdata.Html" />
< /div>
在上面的VT模版中,定義了兩個name為"topnews”的<vt:template>標簽,這是為了便於在代碼裡對這兩個<vt:template>進行統一處理(因為它們要處理的數據都是相同,只是獲取數據條件不同)而定義的名稱。並且分別定義了自定義屬性type用於做數據獲取條件。其中包含文件cnblogs_newsdata.Html的VT模版如下:
<ul class="topnews block_list bt">
<vt:foreach from="#.newsdata" item="news" index="i" id="newslist">
<li>
<a href="{$:#.news.url}" title="{$:#.news.title htmlencode='true'}">{$:#.news.title Htmlencode='true'}...</a>
</li>
</vt:foreach>
< /ul>
在此文件的VT模版中,定義了一個id為"newslist"的<vt:foreach>標簽,定義此id是為了在程序代碼裡控制新聞的輸出和處理每條新聞的訪問地址,也即是"{$:#.news.url}”變量表達式的值。
示例代碼:
//獲取所有名稱為topnews的模版塊
ElementCollection<Template> templates = this.Document.GetChildTemplatesByName("topnews");
foreach (Template template in templates)
{
//根據模版塊裡定義的type屬性條件取得新聞數據
List<News> newsData = GetNewsData(template.Attributes.GetValue("type"));
//設置變量newsdata的值
template.Variables.SetValue("newsdata", newsData);
//取得模版塊下Id為newslist的標簽(也即是在cnblogs_newsdata.Html文件中定義的foreach標簽)
Tag tag = template.GetChildTagById("newslist");
if (tag is ForEachTag)
{
//如果標簽為foreach標簽則設置其BeforeRender事件用於設置變量表達式{$:#.news.url}的值
tag.BeforeRender += (sender, e) =>
{
ForEachTag t = (ForEachTag)sender;
//取得當前項的值(因為foreach標簽的數據源是List<News>集合,所以當前項的值類型為News實體)
News news = (News)t.Item.Value;
//設置當前項的變量表達式的值.也即是"{$:#.news.url}"變量表達式
t.Item.SetExpValue("url", GetNewsUrl(news));
};
}
}
在上面代碼中使用了BeforeRender事件,此事件是在標簽元素的數據呈現之前觸發。對於循環元素<vt:foreach>和<vt:for>,因為每次循環時都會呈現數據,也就導致每次循環時都會觸發此事件(包括AfterRender事件),所以我們就可通過此事件方法獲取到循環當前項的值。
具體的示例代碼,請參考:http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/cnblogs_newslist.ashx.cs