最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)動(dòng)態(tài)生成靜態(tài)頁(yè)面的類(lèi)詳解

 更新時(shí)間:2016年04月20日 11:21:12   作者:且行且思  
這篇文章主要介紹了C#實(shí)現(xiàn)動(dòng)態(tài)生成靜態(tài)頁(yè)面的類(lèi),結(jié)合實(shí)例形式詳細(xì)分析了C#動(dòng)態(tài)生成靜態(tài)頁(yè)面的原理與相關(guān)使用技巧,需要的朋友可以參考下

本文實(shí)例講述了C#實(shí)現(xiàn)動(dòng)態(tài)生成靜態(tài)頁(yè)面的類(lèi)。分享給大家供大家參考,具體如下:

動(dòng)態(tài)生成靜態(tài)頁(yè)面有許多好處,比如生成html網(wǎng)頁(yè)有利于被搜索引擎收錄。同時(shí),由于減少了數(shù)據(jù)訪問(wèn),減輕對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的壓力,提高了網(wǎng)頁(yè)打開(kāi)速度。

基本思路:

使用一個(gè)字符串作為頁(yè)面模板,再頁(yè)面中包含用若干標(biāo)志(用 {標(biāo)志名} 表示),生成頁(yè)面時(shí),將標(biāo)志替換為對(duì)應(yīng)的值。

實(shí)現(xiàn)方法:

在初始化TextTemplate實(shí)例時(shí)讀入模板,以標(biāo)志為分割點(diǎn)將模板分割成幾部分,生成頁(yè)面時(shí)只需簡(jiǎn)單的將模板內(nèi)容和標(biāo)志的值連接起來(lái)。例如:
假如有一個(gè)模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN
初始化時(shí)將模板分割成 "ABCD","EFG","HIJ","KMUN"四個(gè)字符串,
假設(shè)TAG1=“123”,TAG2=“456”,TAG3=“789”
則生成是相當(dāng)于執(zhí)行"ABCD"+"123"+"EFG"+"456"+"HIJ"+"789"+"KMUN"

代碼:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO;
/// <summary>
/// 表示一個(gè)文本模板,該類(lèi)使用一個(gè)字符串作為模板,通過(guò)將模板中的標(biāo)志替換為對(duì)應(yīng)的值(模板中的標(biāo)志用 {標(biāo)志名} 表示)生成新的文本
/// </summary>
/// <example>以下代碼用文本模板生成IMG標(biāo)志
/// <code>
/// static class Program
/// {
///  [STAThread]
///  static void Main()
///  {
///   TextTemplate temp = new TextTemplate("&lt;img src='{src}' alt='{alt}' /&gt;");
///   Console.WriteLine(temp.Render("pic.bmp","Image"));
///   Hashtable values = new Hashtable();
///   values.Add("src", "pic.bmp");
///   values.Add("alt", "image");
///   Console.WriteLine(temp.Render(values));
///  }
/// }
///
/// 輸出為:
/// &lt;img src='pic.bmp' alt='Image' /&gt;
/// &lt;img src='pic.bmp' alt='image' /&gt;
///
/// </code>
/// </example>
public class TextTemplate
{
 TextTemplateTag[] _tags;
 String[] _contentParts;
 int _tagCount;
 private TextTemplate()
 {
  _tagCount = 0;
  _tags = null;
  _contentParts = null;
 }
 /// <summary>
 /// 用指定的模板初始化TextTemplate
 /// </summary>
 /// <param name="content">模板內(nèi)容</param>
 public TextTemplate(String content)
 {
  FromString(content);
 }
 /// <summary>
 /// 用指定的模板初始化TextTemplate,模板內(nèi)容重文件讀入
 /// </summary>
 /// <param name="file">模板文件位置</param>
 /// <param name="encoding">文件使用的編碼</param>
 public TextTemplate(string file, Encoding encoding)
 {
  StreamReader sr = new StreamReader(file, encoding);
  try
  {
   string content = sr.ReadToEnd();
   FromString(content);
  }
  catch (Exception)
  {
   sr.Close();
   throw;
  }
  sr.Close();
 }
 /// <summary>
 /// 讀入模板并以標(biāo)志為分割點(diǎn)分割模板
 /// </summary>
 /// <param name="content"></param>
 private void FromString(String content)
 {
  MatchCollection mc = Regex.Matches(content, "{\\w+}");
  _tagCount = mc.Count;
  _tags = new TextTemplateTag[mc.Count];
  _contentParts = new string[mc.Count + 1];
  int index = 0;
  foreach (Match m in mc)
  {
   _tags[index++] = new TextTemplateTag(m.Value.Substring(1, m.Value.Length - 2), m.Index, m.Length);
  }
  int start = 0;
  index = 0;
  foreach (TextTemplateTag con in _tags)
  {
   _contentParts[index] = content.Substring(start, con.Position - start);
   start = con.Position + con.Length;
   index++;
  }
  if (start < content.Length) _contentParts[index] = content.Substring(start);
 }
 /// <summary>
 /// 用指定的值生成文本
 /// </summary>
 /// <param name="values">各標(biāo)志對(duì)應(yīng)的值(用標(biāo)志名作為key)</param>
 /// <returns>生成的文本</returns>
 /// <example>以下代碼用文本模板生成IMG標(biāo)志
 /// <code>
 /// static class Program
 /// {
 ///  [STAThread]
 ///  static void Main()
 ///  {
 ///   TextTemplate temp = new TextTemplate("&lt;img src='{src}' alt='{alt}' /&gt;");
 ///   Console.WriteLine(temp.Render("pic.bmp","Image"));
 ///   Hashtable values = new Hashtable();
 ///   values.Add("src", "pic.bmp");
 ///   values.Add("alt", "image");
 ///   Console.WriteLine(temp.Render(values));
 ///  }
 /// }
 ///
 /// 輸出為:
 /// &lt;img src='pic.bmp' alt='Image' /&gt;
 /// &lt;img src='pic.bmp' alt='image' /&gt;
 ///
 /// </code>
 /// </example>
 public string Render(Hashtable values)
 {
  StringBuilder result = new StringBuilder(8 * 1024);
  int i = 0;
  for (i = 0; i < _tagCount; i++)
  {
   result.Append(_contentParts[i]);
   if (values[_tags[i].Name] != null)
    result.Append(values[_tags[i].Name]);
   else
    result.Append("{" + _tags[i].Name + "}");
  }
  result.Append(_contentParts[i]);
  return result.ToString();
 }
 /// <summary>
 /// 用指定的值生成文本
 /// </summary>
 /// <param name="args">各標(biāo)志對(duì)應(yīng)的值(忽略標(biāo)志名,第一個(gè)標(biāo)志對(duì)應(yīng)第一個(gè)參數(shù),以此類(lèi)推)</param>
 /// <returns>生成的文本</returns>
 /// <example>以下代碼用文本模板生成IMG標(biāo)志
 /// <code>
 /// static class Program
 /// {
 ///  [STAThread]
 ///  static void Main()
 ///  {
 ///   TextTemplate temp = new TextTemplate("&lt;img src='{src}' alt='{alt}' /&gt;");
 ///   Console.WriteLine(temp.Render("pic.bmp","Image"));
 ///   Hashtable values = new Hashtable();
 ///   values.Add("src", "pic.bmp");
 ///   values.Add("alt", "image");
 ///   Console.WriteLine(temp.Render(values));
 ///  }
 /// }
 ///
 /// 輸出為:
 /// &lt;img src='pic.bmp' alt='Image' /&gt;
 /// &lt;img src='pic.bmp' alt='image' /&gt;
 ///
 /// </code>
 /// </example>
 public string Render(params object[] args)
 {
  StringBuilder result = new StringBuilder(2 * 1024);
  int i = 0;
  for (i = 0; i < _tagCount; i++)
  {
   result.Append(_contentParts[i]);
   result.Append(args[i].ToString());
  }
  result.Append(_contentParts[i]);
  return result.ToString();
 }
 /// <summary>
 /// 用指定的值生成文本,并保存到文件中
 /// </summary>
 /// <param name="file">要保存的文件路徑</param>
 /// <param name="encoding">文件的編碼</param>
 /// <param name="values">各標(biāo)志對(duì)應(yīng)的值(用標(biāo)志名作為key)</param>
 public void SaveAs(string file, Encoding encoding, Hashtable values)
 {
  StreamWriter sw = new StreamWriter(file, false, encoding);
  try
  {
   String content = Render(values);
   sw.Write(content);
  }
  catch (Exception)
  {
   sw.Close();
   throw;
  }
  sw.Close();
 }
 /// <summary>
 /// 用指定的值生成文本,并保存到文件中
 /// </summary>
 /// <param name="file">要保存的文件路徑</param>
 /// <param name="encoding">文件的編碼</param>
 /// <param name="args">各標(biāo)志對(duì)應(yīng)的值(忽略標(biāo)志名,第一個(gè)標(biāo)志對(duì)應(yīng)第一個(gè)參數(shù),以此類(lèi)推)</param>
 public void SaveAs(string file, Encoding encoding, params object[] args)
 {
  StreamWriter sw = new StreamWriter(file, false, encoding);
  try
  {
   String content = Render(args);
   sw.Write(content);
  }
  catch (Exception)
  {
   sw.Close();
   throw;
  }
  sw.Close();
 }
 /// <summary>
 /// 將模板以指定的分隔標(biāo)志分隔成小模板
 /// </summary>
 /// <param name="splitTag"></param>
 /// <returns></returns>
 public TextTemplate[] Split(string splitTag)
 {
  List<TextTemplate> temps = new List<TextTemplate>();
  List<string> contentParts = new List<string>();
  List<TextTemplateTag> tags = new List<TextTemplateTag>();
  int i = 0;
  foreach (string content in _contentParts)
  {
   contentParts.Add(content);
   if (i >= _tags.Length || _tags[i].Name == splitTag)
   {
    TextTemplate newTemp = new TextTemplate();
    newTemp._contentParts = contentParts.ToArray();
    newTemp._tags = tags.ToArray();
    newTemp._tagCount = tags.Count;
    temps.Add(newTemp);
    contentParts.Clear();
    tags.Clear();
   }
   else
    tags.Add(new TextTemplateTag(_tags[i].Name, _tags[i].Position, _tags[i].Length));
   i++;
  }
  return temps.ToArray();
 }
}
internal class TextTemplateTag
{
 int _position, _length;
 string _name;
 public TextTemplateTag(string name, int pos, int len)
 {
  _name = name;
  _position = pos;
  _length = len;
 }
 public string Name
 {
  get { return _name; }
 }
 public int Position
 {
  get { return _position; }
 }
 public int Length
 {
  get { return _length; }
 }
}

實(shí)例代碼:

static class Program
{
 [STAThread]
 static void Main()
 {
  TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />");
  Console.WriteLine(temp.Render("pic.bmp","Image"));
  Hashtable values = new Hashtable();
  values.Add("src", "pic.bmp");
  values.Add("alt", "image");
  Console.WriteLine(temp.Render(values));
 }
}

輸出為:

<img src='pic.bmp' alt='Image' />
<img src='pic.bmp' alt='image' />

其他應(yīng)用:

TextTemplate還可以用來(lái)在安裝網(wǎng)站時(shí)生成Web.Config文件,只需定義以下模板:

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 <appSettings></appSettings>
 <connectionStrings>
  <add
   name="DJDB.LocalSqlServer"
   connectionString="{CONNECTIONSTRING}"
   providerName="System.Data.SqlClient"
  />
 </connectionStrings>
 其他配置
</configuration>

在設(shè)置標(biāo)志 CONNECTIONSTRING 的值即可,這種方法比用XMLDocument類(lèi)要方便得多。

總結(jié):

TextTemplate的優(yōu)點(diǎn)有:

1、模板只在初始化時(shí)就分析并分割存儲(chǔ),當(dāng)使用同一模板生成多個(gè)頁(yè)面時(shí),只是簡(jiǎn)單的件模板內(nèi)容和標(biāo)志的值連接起來(lái),不需要每次都去分析模板,如果使用string的Replace方法則每一次都要去分析字符串,而且如果標(biāo)志值中含有標(biāo)志,會(huì)影響生成的頁(yè)面。

2、模板可以從文件讀入,因此模板文件可以使用各種網(wǎng)頁(yè)制作工具編輯。

更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見(jiàn)控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)

希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • c#版json數(shù)據(jù)解析示例分享

    c#版json數(shù)據(jù)解析示例分享

    JSON(全稱(chēng)為JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它是基于JavaScript語(yǔ)法標(biāo)準(zhǔn)的一個(gè)子集。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,可以很容易在各種網(wǎng)絡(luò)、平臺(tái)和程序之間傳輸。JSON的語(yǔ)法很簡(jiǎn)單,易于人閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成
    2014-03-03
  • 通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件

    通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件

    這篇文章介紹了通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • c#在excel中添加超鏈接示例分享

    c#在excel中添加超鏈接示例分享

    c#在excel中添加超鏈接示例分享,大家參考使用吧
    2013-12-12
  • WPF彈出帶蒙板的消息框

    WPF彈出帶蒙板的消息框

    這篇文章主要為大家詳細(xì)介紹了WPF彈出帶蒙板的消息框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解

    C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解

    下面小編就為大家?guī)?lái)一篇C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 基于C#實(shí)現(xiàn)自定義計(jì)算的Excel數(shù)據(jù)透視表

    基于C#實(shí)現(xiàn)自定義計(jì)算的Excel數(shù)據(jù)透視表

    數(shù)據(jù)透視表(Pivot?Table)是一種數(shù)據(jù)分析工具,通常用于對(duì)大量數(shù)據(jù)進(jìn)行匯總、分析和展示,本文主要介紹了C#實(shí)現(xiàn)自定義計(jì)算的Excel數(shù)據(jù)透視表的相關(guān)知識(shí),感興趣的可以了解下
    2023-12-12
  • c#(Socket)同步套接字代碼示例

    c#(Socket)同步套接字代碼示例

    c#(Socket)同步套接字代碼示例...
    2007-03-03
  • C#實(shí)現(xiàn)微信紅包功能

    C#實(shí)現(xiàn)微信紅包功能

    這篇文章主要介紹了C#實(shí)現(xiàn)微信紅包功能,使用正態(tài)分布計(jì)算紅包金額,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#實(shí)現(xiàn)如何使用短信平臺(tái)自動(dòng)通知用戶(hù)實(shí)例

    C#實(shí)現(xiàn)如何使用短信平臺(tái)自動(dòng)通知用戶(hù)實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)如何使用短信平臺(tái)自動(dòng)通知用戶(hù)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C#實(shí)現(xiàn)TFTP客戶(hù)端的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)TFTP客戶(hù)端的項(xiàng)目實(shí)踐

    TFTP不僅有斷點(diǎn)續(xù)傳,多用戶(hù)級(jí)別限制等功能,本文主要介紹了C#實(shí)現(xiàn)TFTP客戶(hù)端的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04

最新評(píng)論

西平县| 商都县| 平定县| 安仁县| 义乌市| 遵义县| 噶尔县| 凌云县| 修文县| 旬阳县| 安顺市| 康定县| 安宁市| 昭平县| 枣阳市| 凤台县| 曲阜市| 郑州市| 太和县| 南陵县| 临安市| 衡水市| 亚东县| 长沙市| 霍林郭勒市| 凤翔县| 宝丰县| 河西区| 定西市| 嘉兴市| 于田县| 兴国县| 邳州市| 府谷县| 铁力市| 遂宁市| 综艺| 遂平县| 寻甸| 通海县| 读书|