程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> VTemplate模版引擎的使用--進階篇(3)

VTemplate模版引擎的使用--進階篇(3)

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved