在使用ASP.NET 程式設計時,開啟一個頁面一般是透過指定超連結位址,呼叫指定的頁面檔案(.html、.aspx)等方法。
但是,如果即將打開的頁面文件的內容是在程式中動態生成,或者是從資料庫的表裡取出的,我們怎麼把這些內容展示出來呢?
我們最直接的想法是,把這些內容先保存成網頁文件,然後再呼叫它。這種方法當然是可以的,但不是最好的方法,因為這樣會在Web 伺服器上產生許多臨時文件,這些文件可能永遠用不著了。
另一個最好的方法是利用文字格式流,把頁面內容動態地展示出來。例如,有一個頁面:
…
<iFrame src=""></iframe>
……
需要用iFrame 開啟一個頁面,這個頁面的內容是動態產生的。我們可以寫一個.ashx 檔案(這裡命名為html.ashx)來處理。 .ashx 檔案裡實作了IHttpHandler 介面類,可以直接產生瀏覽器所使用的資料格式。
html.ashx 檔案內容:
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.IO;
using System.Web;
public class Handler : IHttpHandler {
public bool IsReusable {
get {
return true;
}
}
public void ProcessRequest (HttpContext context)
{
// Set up the response settings
context.Response.ContentType = "text/html";
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
Stream stream = null;
string html = "<html><body>成功: test of txt.ashx</body></html>";
byte[] html2bytes = System.Text.Encoding.ASCII.GetBytes(html);
stream = new MemoryStream(html2bytes);
if (stream == null)
stream = new MemoryStream(System.Text.Encoding.ASCII.GetBytes("<html><body>get Nothing!</body></html>"));
//Write text stream to the response stream
const int buffersize = 1024 * 16;
byte[] buffer = new byte[buffersize];
int count = stream.Read(buffer, 0, buffersize);
while (count > 0)
{
context.Response.OutputStream.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffersize);
}
}
}
html.ashx 檔案中先把string 字串轉換為位元組(byte)數組,然後再產生記憶體中的MemoryStream 資料流,最後再寫到OutputStream 物件中,顯示出來。
這樣以來,我們就可以透過<iFrame src="html.ashx"></iframe> 來展示動態產生的頁面,顯示「成功: test of txt.ashx」的網頁內容。 html.ashx 檔案中string html = "<html><body>成功: test of txt.ashx</body></html>"; 一句中,變數html 的內容完全可以從資料庫中得到(事先把一個html文件內容保存在資料庫中)。
作者: 張慶( http://www.why100000.com )