zoukankan      html  css  js  c++  java
  • Asp.net 生成静态页面(简单用法)


     开发步骤:

          1、路径映射类(UrlMapping),主要对路径进行拆分、拼接。(关键的一步)

          2、过滤流类(FilterStream),主要负责生成静态页面。

          3、静态页面类(HtmlPage),主要是调用UrlMapping和FilterStream类,

              哪个页面想静态化,就继承这个类。

          4、HtmlHandler类,路径后缀为Html的,都由它来处理,与HtmlPage类相似。

          5、HtmlPanel类(控件),页面带上这个控件,超链接会静态化。(详情请下载源码包)

          部分代码:

    路径映射类
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.IO;

    namespace Eshop.Web.UI
    {
    /// <summary>
    /// 路径映射
    /// </summary>
    public static class UrlMapping
    {
    //Aspx 转换到 Html
    public static string AspxToHtml(string url)
    {
    //判断路径是否为空
    if (string.IsNullOrEmpty(url))
    {
    throw new ArgumentNullException("路径不能为空");
    }

    //分割路径
    string[] temp = url.Split('?');

    if (temp.Length != 1 && temp.Length != 2)
    {
    throw new ArgumentException(String.Format("路径 {0} 及其参数错误", url));
    }

    //获取路径后缀
    string ext = Path.GetExtension(temp[0]);
    if (!(ext.Equals(".aspx", StringComparison.OrdinalIgnoreCase)))
    {
    throw new ArgumentException(String.Format("路径 {0} 类型必须为ASPX", url));
    }

    //截取.aspx中前面的内容
    int offset = temp[0].LastIndexOf('.');
    string resource = temp[0].Substring(0, offset);

    //路径不带参数时
    if (temp.Length == 1 || string.IsNullOrEmpty(temp[1]))
    {
    return string.Format("{0}.html", resource); //拼接
    }

    //路径带参数时
    return string.Format("{0}___{1}.html", resource, temp[1]); //拼接
    }

    //Html 转换到 Aspx
    public static string HtmlToAspx(string url)
    {
    //判断路径是否为空
    if (string.IsNullOrEmpty(url))
    {
    throw new ArgumentNullException("路径不能为空");
    }

    string ext = Path.GetExtension(url);
    if (!(ext.Equals(".html", StringComparison.OrdinalIgnoreCase)))
    {
    throw new ArgumentException(String.Format("路径 {0} 类型必须为HTML", url));
    }

    string[] temp = url.Split(new String[] { "___", "." }, StringSplitOptions.RemoveEmptyEntries);
    if (temp.Length == 2)
    {
    return string.Format("{0}.aspx", temp[0]);
    }

    if (temp.Length == 3)
    {
    return String.Format("{0}.aspx?{1}", temp[0], temp[1]);
    }

    throw new ArgumentException(String.Format("资源 {0} 及其参数错误", url));
    }
    }
    }

     

    过滤流类
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.IO;

    namespace Eshop.Web.UI
    {
    /// <summary>
    /// 静态网页保存
    /// </summary>
    public class FilterStream : Stream
    {
    private Stream respStream = null;
    private Stream fileStream = null;

    public FilterStream(Stream respStream, string filePath)
    {
    if (respStream == null)
    throw new ArgumentNullException("输出流不能为空");

    this.respStream = respStream;

    try
    {
    this.fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write); //写入到文件夹中
    }
    catch { }
    }

    public override bool CanRead
    {
    get { return this.respStream.CanRead; }
    }

    public override bool CanSeek
    {
    get { return this.respStream.CanSeek; }
    }

    public override bool CanWrite
    {
    get { return this.respStream.CanWrite; }
    }

    public override void Flush()
    {
    this.respStream.Flush();

    if (this.fileStream != null)
    {
    this.fileStream.Flush();
    }
    }

    public override long Length
    {
    get { return this.respStream.Length; }
    }

    public override long Position
    {
    get
    {
    return this.respStream.Position;
    }
    set
    {
    this.respStream.Position = value;

    if (this.fileStream != null)
    {
    this.fileStream.Position = value;
    }
    }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
    return this.respStream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
    if (this.fileStream != null)
    {
    this.fileStream.Seek(offset, origin);
    }

    return this.respStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
    this.respStream.SetLength(value);

    if (this.fileStream != null)
    {
    this.fileStream.SetLength(value);
    }
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
    this.respStream.Write(buffer, offset, count);

    if (this.fileStream != null)
    {
    this.fileStream.Write(buffer, offset, count);
    }
    }

    protected override void Dispose(bool disposing)
    {
    base.Dispose(disposing);

    this.respStream.Dispose();
    if (this.fileStream != null)
    {
    this.fileStream.Dispose();
    }
    }
    }
    }


     

     

    静态页面类
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.IO;

    namespace Eshop.Web.UI
    {
    /// <summary>
    /// 哪个页面想静态化,就继承这个类
    /// </summary>
    public class HtmlPage:Page
    {
    // <summary>
    /// 获取物理路径,判断文件夹中有没有存在这个文件
    /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
    /// 存在的话,就直接显示页面
    /// </summary>
    public override void ProcessRequest(HttpContext context)
    {
    HttpRequest req = context.Request;
    HttpResponse resp = context.Response;

    string htmlPage = UrlMapping.AspxToHtml(req.RawUrl);
    string htmlFile = context.Server.MapPath(htmlPage);

    if (File.Exists(htmlFile))
    {
    resp.Redirect(htmlPage);
    return;
    }

    // Html 页面不存在
    resp.Filter = new FilterStream(resp.Filter, htmlFile);
    base.ProcessRequest(context);
    }
    }
    }
    HtmlHandler
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.IO;

    namespace Eshop.Web.UI
    {
    /// <summary>
    /// 后缀为HTML的,都经这里处理
    /// web.config
    /// <remove verb="*" path="*.HTML"/>
    /// <add verb="*" path="*.HTML" type="Eshop.Web.UI.HtmlHandler,AspxToHtmlDemo"/>
    /// </summary>
    public class HtmlHandler:IHttpHandler
    {
    public bool IsReusable
    {
    get { return false; }
    }

    /// <summary>
    /// 获取物理路径,判断文件夹中有没有存在这个文件
    /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
    /// 存在的话,就直接显示页面
    /// </summary>
    public void ProcessRequest(HttpContext context)
    {
    HttpRequest request = context.Request;
    HttpResponse response = context.Response;

    string htmlPage = request.RawUrl;
    string htmlFile = context.Server.MapPath(htmlPage);

    if (File.Exists(htmlFile))
    {
    response.WriteFile(htmlFile);
    return;
    }

    //Html 文件不存在
    string aspxPage = UrlMapping.HtmlToAspx(htmlPage);
    response.Redirect(aspxPage);
    }

    }
    }
    页面
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Eshop.Web.Index" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>AspxToHtml Demo</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <h1>AspxToHtml Demo</h1>
    <br />

    <html:HtmlPanel ID="hp" runat="server">
    <asp:HyperLink ID="Hy" runat="server" NavigateUrl="~/Index.aspx?page=2">
    点击
    </asp:HyperLink>
    <br />
    <a href="~/Index.aspx?page=2" runat="server">Hello</a>
    </html:HtmlPanel>
    </div>
    </form>
    </body>
    </html>

      源码包:   /Files/tonycall/AspxToHtmlDemo.zip


  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/2389631.html
Copyright © 2011-2022 走看看