前言
web项目之中由于网页的头和尾乃至于导航栏等一些元素都是固定不变的或者很少改变,我在网上搜了下相关的一些处理方法。主流就是母版页技术,还有用到iframe的(菜单之间切换较多)。这些总给人一些比较慢的感觉。其他的方法没有很具体的说明,也完全有我没搜索到的原因。签于此,我打算分享一种比较小众的解决方案,希望对一些不太熟悉相关技术的新手朋友们一些帮助。
方案思路
实现这个方案要用到一个webform控件:Literal。不熟悉的朋友可以去搜一下相关资料,这里只介绍最简单的功能,那就是相当于一个label控件,只不过它不在生成的网页添加任何标签,text是什么值就显示出什么值,包括空格换行符等等。因此我们把一个html网页中或者就简单的txt文件中所有的文本读取出来赋值给Literal,再把Literal放在网页的合适位置就可以了。
具体实现
我这里就用asp.net演示一下。首先要读取一个html文件中的文本信息。这里用到文件操作相关类,至于文件的访问权限控制,大家自己去设置更改一下。代码如下:
class="code_img_closed" src="/Upload/Images/2013102920/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('624dc149-7129-4f2a-9f65-d9edf9582061',event)" src="/Upload/Images/2013102920/2B1B950FA3DF188F.gif" alt="" />using System; using System.Text; using System.IO; namespace BtoL.dapinhuo.Common { public class PageTemplate { /// <summary> /// 读取文件的全部内容 /// </summary> /// <param name="sitePath">html文件的虚拟路径类似引用css,js等文件路径</param> /// <returns>string</returns> public static string GetTemplate(string sitePath) { StringBuilder strReturn = new StringBuilder(220000); //返回的字符 string templetFullPath = Utils.GetMapPath(sitePath); //取得文件物理路径 //检查文件是否存在 if (!File.Exists(templetFullPath)) { return ""; } //开始读文件 using (StreamReader objReader = new StreamReader(templetFullPath, Encoding.UTF8)) { strReturn.Append(objReader.ReadToEnd()); objReader.Close(); } return strReturn.ToString(); } } }View Code
为了方便,引用文件的路径设置成虚拟路径,这样跟引用css,js文件的路径一样了,比较方便。所以需要再写一个虚拟路径转换成物理路径的方法。代码如下:
/// <summary> /// 获得当前绝对路径 /// </summary> /// <param name="strPath">指定的路径</param> /// <returns>绝对路径</returns> public static string GetMapPath(string strPath) { if (strPath.ToLower().StartsWith("http://")) { return strPath; } if (HttpContext.Current != null) { return HttpContext.Current.Server.MapPath(strPath); } else //非web程序引用 { strPath = strPath.Replace("/", "\\"); if (strPath.StartsWith("\\")) { strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\'); } return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); } }View Code
最重要的方法都有了,下面就直接使用Literal控件了。我这里使用的是asp.net,我把Literal赋值操作放在Page_Load事件里面,大家可以根据自己需要放在页面生命周期里不同的事件中。asp.net前端页面如下(部分,其余地方和html页面一样):
<div class="left180"> <!--Sidebar--> <asp:Literal ID="LitScenterNav" runat="server"></asp:Literal> <!--/Sidebar--> </div>
后面赋值代码:
protected void Page_Load(object sender, EventArgs e) { LitScenterNav.Text = PageTemplate.GetTemplate("文件虚拟路径"); }
将你要引用的html文件路径放在“文件虚拟路径”,最后显示的效果(随便写的东西):
<!--Sidebar--> <div class="sidebar"> <h3>管理</h3> <ul> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul> <h3>管理</h3> <ul> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul> </div> <!--/Sidebar-->View Code
Literal所在位置全部替换成html文件中的文本(全部文本)。
后记
由于这是轻量级的,所以很多功能需要自己去实现控制。我比较喜欢这种绝对控制的感觉。这里用到了Literal控件,比较简单,如果要折腾,可以在页面周期的事件中自己用写文件的方式添加文本。其他的也可以自己控制。我是个新手,了解的比较少,目前我比较喜欢这种方案,如果你有更好的东西,还望不吝赐教!