一、生成真静态页
protected void lbtnIndex_Click(object sender, EventArgs e)
{
string url = "http://"+Request.Url.Host+":"+Request.Url.Port+"/index.aspx";
Utility.Tool.GenHTMLFromURL(url, Server.MapPath("/index.html"), "");
Utility.Tool.Alert("生成成功",this.Page);
}
二、采用iframe方法生成静态页
1、把网页中动态部分:如留言信息,用ifrme包括起来做成一个新页面 replay.aspx
2、在head部分加上 //加在包括的页面里 即 replay.aspx
<script language="javascript" type="text/javascript">
$(function() {
var h = $(document).height(); // 当前文档的高度
h = parseInt(h);
var $frm = $(window.parent.document.getElementById("frmreplay"));
$frm.height(h);
})
function changeCode() {
var imgNode = document.getElementById("vimg");
imgNode.src = "handler/WaterMark.ashx?t=" + (new Date()).valueOf(); // 这里加个时间的参数是为了防止浏览器缓存的问题
}
</script>
3、在news_content.aspx中的动态部分拖入一个 <asp:Literal ID="litfrm" runat="server"></asp:Literal>
4、在cs中加上
litfrm.Text = "<iframe id='frmreplay' name='frmreplay' frameborder='no' src='replay.aspx?newsid=" + news.Id + "' style='border:none; width: 100%;' scrolling='no'></iframe>";
5、在网站后台加一个按钮,生成静态页
DataTable dt = nm.SelectAll(); //获取所所有新闻 select * from news
foreach (DataRow row in dt.Rows)
{
string newsid = row["id"].ToString(); //取出所有新闻的id用于生成静态页
string url = "http://" + Request.Url.Host + ":" + Request.Url.Port + "/Web/newscontent.aspx?newsid=" + newsid;
Xiaobin.Utility.Tool.GenHTMLFromURL(url, Server.MapPath("~/" + newsid + ".html"), "");
}
6、修改前台的指向<a href='<%#Eval("id") %>.html'><%#Eval("title")</a>
三、采用模版生成静态页
1、先使用第一种方法生成一个真静态页GenHTMLFromURL
2、在生成静态页的html文件中如: temp.html 中的所有需要从数据库中获取数据的变量改为 $id$、$title$、$body$、$visitnum$、$createdate$
3、和第二种方法一样只是
DataTable dt = nm.SelectAll(); //获取所所有新闻 select * from news
foreach (DataRow row in dt.Rows)
{
string newsid = row["id"].ToString();
string title = row["title"].ToString();
string body = row["content"].ToString();
string time = DateTime.Parse(row["createtime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
Xiaobin.Utility.Tool.GenHTMLFromTemp(Server.MapPath("../static/temp.html"), Server.MapPath("../static/" + newsid + ".html"), new List<string> { "$title$", "$body$", "$time$", "$id$" }, new List<string> { title, body, time, newsid }, "");
}
四、采用UrlRewriter实现伪静态
1、web层中引用Intelligencia.UrlRewriter.dll
2、修改web.config文件
<configSections>
<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>
</configSections>
3、在system.web节点里
<httpModules>
<add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter"/>
</httpModules>
4、正则表达式重写url添加在system.web节点外面(上面)
<rewriter>
<rewrite url="news_content(\d+).html" to="news_content.aspx?id=$1" /> //url为重写后的地址,to为原地址,$1代表第一个括号匹配的值
<rewrite url="aboutus(\d+)_(\d+).html" to="aboutus.aspx?id=$1&cabh=$2" /> //id=$1&cabh=$2 $1为第一个参数,$2为第二个参数
</rewriter>
5、修改前台链接地址
如news.aspx页面中的链接原为:
news_content.aspx?id=<%#Eval("id") %> 改为 news_content<%#Eval("id") %>.html
五、采用URLRewriter.dll实现伪静态
1、web层中引用URLRewriter.dll
2、修改web.config文件、引用URLRewrite.dll伪静态
在<configuration>节点中的<configSections>节点中加上
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
3、正则表达式重写url添加在system.web节点上面
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/news_body(\d+).html</LookFor> //LookFor生成的伪静态 (\d+)为指向原路径的第一个参数
<SendTo>~/news_body.aspx?id=$1</SendTo> //SendTo指向的原页面 $1为第一个正则匹配参数
</RewriterRule>
<RewriterRule>
<LookFor>~/web/new/(.[0-9]*)\.aspx</LookFor> //~/表示根目录
<SendTo>~/web/new.aspx?id=$1</SendTo> //注:用URLRewriter实现伪静态一定要加上文件的路径
</RewriterRule>
</Rules>
</RewriterConfig>
或者加上:<RewriterConfig configSource="URLRewriter.config"/> //用于多数正则表达规则的单独文件
在网站根目录中新建URLRewriter.config文件,和以上规则一样的xml文件
4、在system.web节点中修改
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
改成:
<compilation defaultLanguage="c#" debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
<!-- 加上此节点,保证原本就是.html类型的文件能正常访问 -->
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
<add extension=".xml" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
<!--采用URLRewriter-->
<httpHandlers>
<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>
<add verb="*" path="*.htm" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>
<add verb="*" path="*.xml" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
加分页伪静态
1、不带参路的分页 直接在anp控件中开启EnableUrlRewriting、UrlPaging、UrlRewritePattern
<RewriterRule>
<LookFor>~/news_list.aspx?page=$1</LookFor> //page参数
<SendTo>~/news_list_(\d).html</SendTo> //url中页码如:news_list_1.html,2为第二页,以此类推
</RewriterRule>
</Rules>
anp控件中开启 EnableUrlRewriting="True" UrlPaging="True" UrlRewritePattern="~/news_list_{0}.html"
/{0}即指重写中的(\d)页码参数
UrlPaging //开启page参数
EnableUrlRewriting //开启url重写
UrlRewritePattern //重写规则
2、带参数的分页 在anp控件中开启EnableUrlRewriting、UrlPaging。并在后台cs中定义UrlRewritePattern参数
<RewriterRule>
<LookFor>~/news_list.aspx?caid=$1&page=$2</LookFor> //caid+page两个参数
<SendTo>~/news_list_(\d)_(\d).html</SendTo> //如news_list_1_1.html 第一个1为caid参数,第二个1为page即页码,如news_list_1_1.html
</RewriterRule>
</Rules>
anp.UrlRewritePattern = "~/news_list_"+caid+"_{0}.html"; //cs文件page_load中加上anp的指向