zoukankan      html  css  js  c++  java
  • ASP.NET使用HttpHandler进行页面静态化(自动生成页面)

    这次的Demo是,一个根页面,点击链接创建子页面,子页面都是一个Template页面进行替换的
    

    在这里插入图片描述

    一个根页面

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="List.aspx.cs" Inherits="Static.List" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <h2>体育新闻</h2>
                
                <p><a href="News/Info_0.html">中国拳手</a></p>
                <p><a href="News/Info_1.html">纳斯很少情绪激动</a></p>
            </div>
        </form>
    </body>
    </html>
    
    

    新建一个类,做假数据用,代替数据库的表

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace Static
    {
        public class News
        {
            public int Id { get; set; }
            public string Title { get; set; }
            public string Time { get; set; }
            public string Content { get; set; }
        }
    }
    

    建一个类,使用List进行加载数据

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace Static
    {
        public class NewsManager
        {
           public  List<News> lists = new List<News>();
            public NewsManager()
            {
                lists.Add(new News()
                {
                    Id=1,
                    Time="1019年1月1日",
                    Content="拳手的内容",
                    Title="拳手的标题"
                });
                lists.Add(new News()
                {
                    Id = 2,
                    Time = "10年1月1日",
                    Content = "情绪的内容",
                    Title = "情绪的标题"
                });
            }
        }
    }
    

    新建一个News文件夹,建一个Tamplate的网页,用来规范网页
    在这里插入图片描述

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <div>
            <p>{$Title}</p>
    
            <p>{$Time}</p>
            <p>{$Content}</p>
        </div>
    </body>
    </html>
    

    建一个类进行操作,继承IHttpHandlers

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    
    namespace Static
    {
        public class FileStaticHandler : IHttpHandler
        {
            public bool IsReusable => true;
    
            public void ProcessRequest(HttpContext context)
            {
                string url = context.Request.RawUrl;
                //通过Url把id取到
                int last = url.LastIndexOf("_");
                int dot = url.LastIndexOf(".");
                int newId = int.Parse(url.Substring(last + 1, dot - last - 1));
                //生成路径
                string userFilePath = context.Server.MapPath("~/News/Info_" + newId + ".html");
                //如果此路径没文件的话,就生成
                if (!File.Exists(userFilePath))
                {
                    //我的加载在类里面写的
                    NewsManager newsManager = new NewsManager();
                    List<News> news = newsManager.lists;
                    //获取某个文件的路径
                    string tempPath = context.Server.MapPath("~/News/Template.html");
                    //把此文件里面的关键字替换掉
                    //把这个文件序列化保存
                    string tempHtml = ReadTemplate(tempPath);
                    tempHtml = tempHtml.Replace("{$Title}", news[newId].Title);
                    tempHtml = tempHtml.Replace("{$Time}", news[newId].Time);
                    tempHtml = tempHtml.Replace("{$Content}", news[newId].Content);
                    //输出此文件
                    WriteHtmlFile(userFilePath, tempHtml);
                }
                //输出文件
                context.Response.WriteFile(userFilePath); 
    
            }
    
            private void WriteHtmlFile(string userFilePath, string tempHtml)
            {
                FileStream fs = new FileStream(userFilePath, FileMode.Create);
                StreamWriter sw = new StreamWriter(fs);
                sw.Write(tempHtml);
                sw.Close();
                fs.Close();
    
            }
    
            private string ReadTemplate(string tempPath)
            {
                if (!File.Exists(tempPath))
                {
                    throw new Exception("新闻详情页面模板文件未找到!");
                }
                FileStream fs = new FileStream(tempPath, FileMode.Open);
                StreamReader sr = new StreamReader(fs);
                string tempHtml = sr.ReadToEnd();
                sr.Close();
                fs.Close();
                return tempHtml;
    
            }
        }
    }
    

    既然用了Handler,就要进行配置文件

    在这里插入图片描述

    <system.webServer>
        <handlers>
          <add name="test" path="News/*.html" verb="*" type="Static.FileStaticHandler" />
        </handlers>
      </system.webServer>
    

    根页面效果图(记得显示全部文件,否则会不显示)
    在这里插入图片描述

    点击了第一个链接,就生成了页面
    在这里插入图片描述

  • 相关阅读:
    Spark源码编译cannot resolve symbol SqlBaseParser
    教你一招 如何给nopcommerce增加新闻类别模块
    网银在线插件 For Nopcommerce V2.6
    nopcommerce之移动版简介
    支付宝插件 For Nopcommerce V2.6
    PropertyInfo
    Druid 连接MySql
    docker中 启动所有的容器命令 关闭所有的容器命令
    Watermarker详解
    kafka 参数设置
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074594.html
Copyright © 2011-2022 走看看