(原文路径http://www.cnblogs.com/amboyna/archive/2007/10/20/931198.html)
在.net中使用/~可以在服务器控件中解决文件的路径问题,所以我也期盼着在html中也可以。幸好我从网上找到了一个非常不错的解决办法。但是原有的解决办法存在一个bug,本文进行了部分的修改
using System.Web;
using System.IO;
using System.Web.UI;
using System.Text.RegularExpressions;
/// <summary>
///CommonBasicPage 的摘要说明
///时间:2009年2月24日
///功能:为KevinWebSite站点所有aspx页面提供最基本的父类支持。
///说明:所有的aspx页面都要继承CommonBasicPage或CommonBasicPage的子类
/// </summary>
public abstract class CommonBasicPage : System.Web.UI.Page
{
#region Vars
/// <summary>
/// 说明:该正则表达式用于对页面中的html控件中引用的图片、脚本等文件的路径进行解析,进而使html控件支持“~/”关键字。
/// </summary>
private static readonly String htmlControlUrlReg;
#endregion
#region Constructed Function
#region 静态构造函数
static CommonBasicPage()
{
htmlControlUrlReg = "<(a|link|img|script|input|form).[^>]*(href|src|action)[ ]*=[ ]*(///"|'|)(.[^///"']*)(///"|'|)[^>]*>";
}
#endregion
#endregion
#region Event
#region override Render
/// <summary>
/// 时间:2009年2月24日
/// 功能:对页面中所有图片、文件等路径进行转换,进而使html控件也支持“~/”
/// 说明:该段代码摘自于网上,参考文章http://www.cnblogs.com/amboyna/archive/2007/10/20/931198.html。
/// 本站对代码进行了一点改动,修改了原来存在的bug。比如参考文章中的代码无法对形如<img src = "~/Image/Snap1.jpg" />进行正确的解析
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
StringWriter tempStringWriter = new StringWriter();
HtmlTextWriter tempHtmlTextWriter = new HtmlTextWriter(tempStringWriter);
base.Render(tempHtmlTextWriter);
string tempPageInnerHtml = tempStringWriter.ToString();
#region 转换相对路径
MatchCollection collection = Regex.Matches(tempPageInnerHtml, htmlControlUrlReg, RegexOptions.IgnoreCase);
foreach (Match match in collection)
{
if (match.Groups[match.Groups.Count - 2].Value.IndexOf("~") != -1)
{
string url = this.Page.ResolveUrl(match.Groups[match.Groups.Count - 2].Value);
tempPageInnerHtml = tempPageInnerHtml.Replace(match.Groups[match.Groups.Count - 2].Value, url);
}
}
#endregion
writer.Write(tempPageInnerHtml);
}
#endregion
#endregion