aspc#利⽤原⽣aspx页⾯做模板引擎
其实这个是根据公司需求,才这样做的。
公司需求是这样的:
⼀个门户⽹站下⾯有很多个城市,⽐如上海、北京、天津等等,然后每个城市都可以为其指定不同的模板,⽽且每个模板不仅调⽤的数据不⼀样,样式也不⼀样。这下可把我弄晕了。咋办⾃⼰写个模板引擎??带标签解析的??太浪费时间了吧!从⽹上下载⼀个NVelocity模板引擎?好像⼜不符合需求。我崩溃了。
庆幸的是我不经意间看到了这个⽅法:context.Server.Execute(string path),它的意思就是执⾏指定虚拟路径的处理程序。然后在⽹上⼜看了下别⼈的⽤法,之后我有了个⼤胆的想法:就⽤它来做模板引擎。
然后我⼜看到别⼈说这种⽅法效率很低。其实我倒觉得⽆所谓,<%@ OutputCache Duration="600" VaryByParam="*" %>这个页⾯缓存弄上去不就⾏了吗??我⼜做了测试,果然不加缓存,页⾯执⾏很慢,也就是⼀秒的样⼦,但是加了缓存,就是瞬间。然后我就做了个⼩的测试项⽬。
具体是这样的:
第⼀步,访问:Handler1.ashx?CityID=1这个页⾯,CityID是可变的。这个页⾯就会根据CityID⾃动判断执⾏哪⼀个aspx页⾯。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Web.Service
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
int CityID = Convert.ToInt32(context.Request["CityID"]);
string TemplatePath = this.GetTemplatePathByCityID(CityID);
//第⼀种
context.Server.Execute(TemplatePath + "?" + context.Request.ServerVariables["Query_String"]);
//第⼆种,下⾯这段⽣成静态⽂件的时候有⽤,如果不⽣成静态⽂件就⽤上⾯这种
//System.IO.TextWriter tw = new System.IO.StringWriter();
//context.Server.Execute(TemplatePath + "?" + context.Request.ServerVariables["Query_String"], tw);
//context.Response.Write(tw.ToString());
}
/// <summary>
/// 根据CityID获取对应的aspx模板
/// </summary>
/// <param name="CityID"></param>
/// <returns></returns>
private string GetTemplatePathByCityID(int CityID)
{
string TemplatePath = string.Empty; ;
switch (CityID)
{
case 1:
TemplatePath = "~/Index1.aspx";
break;
case 2:
TemplatePath = "~/Index2.aspx";
break;
default:
TemplatePath = "~/Index1.aspx";
break;
}
return TemplatePath;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Web.Service
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
int CityID = Convert.ToInt32(context.Request["CityID"]);
string TemplatePath = this.GetTemplatePathByCityID(CityID);
//第⼀种
context.Server.Execute(TemplatePath + "?" + context.Request.ServerVariables["Query_String"]);
//第⼆种,下⾯这段⽣成静态⽂件的时候有⽤,如果不⽣成静态⽂件就⽤上⾯这种
//System.IO.TextWriter tw = new System.IO.StringWriter();
//context.Server.Execute(TemplatePath + "?" + context.Request.ServerVariables["Query_String"], tw); //context.Response.Write(tw.ToString());
}
/// <summary>
/// 根据CityID获取对应的aspx模板
/// </summary>
/// <param name="CityID"></param>
/// <returns></returns>
private string GetTemplatePathByCityID(int CityID)
{
string TemplatePath = string.Empty; ;
switch (CityID)
{
case 1:
TemplatePath = "~/Index1.aspx";
break;
case 2:
TemplatePath = "~/Index2.aspx";
break;
default:
TemplatePath = "~/Index1.aspx";
break;
}
return TemplatePath;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
之所以⽤⼀般处理程序来运⾏页⾯,是因为它不需要继承Page类,性能会好⼀点,⽽且它没有HTML元素输出。
第⼆步, Index1.aspx 或者 Index2.aspx ,这两个页⾯就⼀个单独的aspx页⾯了,CS⽂件没了。它的Inherits属性和 CodeBehind属性都被我删了。
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ OutputCache Duration="600" VaryByParam="*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<%=Request["CityID"]%>
<form id="form1" runat="server">
<div>
<table border="1">
<tr>
<th>⽤户名</th>
<th>密码</th>
</tr>
<%foreach(System.Data.DataRow dr in App.Bll.Index.Instance().GetTable1().Rows){ %>
<tr>
<td><%=dr["username"] %></td><td><%=dr["password"] %></td>
</tr>
<%} %>
</table>
</div>
</form>
</body>
</html>
%@ Page Language="C#" AutoEventWireup="true" %>
<%@ OutputCache Duration="600" VaryByParam="*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<%=Request["CityID"]%>
<form id="form1" runat="server">
<div>
<table border="1">
<tr>
<th>⽤户名</th>
<th>密码</th>
</tr>
<%foreach(System.Data.DataRow dr in App.Bll.Index.Instance().GetTable1().Rows){ %>
<tr>
<td><%=dr["username"] %></td><td><%=dr["password"] %></td>
</tr>
<%} %>
</table>
</div>
</form>
</body>
</html>
第三步,就是我建了⼀个名称为App的项⽬⽂件,在这⾥⾯做了⼀个简单的数据查。App.Bll.Index.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace App.Bll
{
public class Index : BasePage
{
private static Index _index { get; set; }
/// <summary>
/
// 获取⾃⼰的实例
/// </summary>
/// <returns></returns>
public static Index Instance()
{
if (_index == null)
{
_index = new Index();
}
return _index;
}
/
// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
public DataTable GetTable1()
{
DataTable dt = new DataTable(); dt.Columns.Add("username");
dt.Columns.Add("password");
DataRow dr = dt.NewRow();
dr["username"] = "subendong";
dr["password"] = "123456";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["username"] = "liran";
dr["password"] = "888888";
dt.Rows.Add(dr);
return dt;
}
/// <summary>静态网页模板免费下载的网站
/// 获取数据
/// </summary>
/// <returns></returns>
public DataTable GetTable2()
{
DataTable dt = new DataTable(); dt.Columns.Add("title");
dt.Columns.Add("content");
DataRow dr = dt.NewRow();
dr["title"] = "title1";
dr["content"] = "content1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["title"] = "title2";
dr["content"] = "content2";
dt.Rows.Add(dr);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论