所谓异目录就是只母板页与内容页不在同一目录。
实现的关键技术技术:html的base标签
关键技术讲解:
base的href规定页面中所有相对链接的基准 URL。其值是个绝对路径。我实现的方法是取 协议+主机名+端口号+路径。
不过,这样设置了之后会存在二个问题。
第一:页面回发的时候会出错。出错的根本原因是回发的原理。其根本原理是表单的提交,而form表单的action是当前页面的名字。
解决方案:action指定绝对路径
第二:内容页的链接不能采用相对路径。
解决方案:Request.Url.ToString().Substring(0, Request.Url.ToString().LastIndexOf('/')+1)获得其所在路径
好了,下面附上完整步骤:
1.在母板页head部分添加标签
<base id="baseHref" runat="server" />
注意:runat="server"一定不可少,要在后台修改其href值
2.母板页后台填加函数setBaseHref,在 Page_Load 中掉用,可以是做页面是否是回发判断,影响不大。
/// <summary>
/// 设置母板页的路径
/// </summary>
/// <param name="path">
/// 从根目录开始,母板页的路径
/// 如母板页所在路径为~/Admin/*.Master
/// 则path应为Admin
/// </param>
void setBaseHref(string path)
{
//给base标签href属性设置母板页所在目录
string url = Request.Url.ToString();
string serverPath = url.Substring(0, url.IndexOf("/", url.IndexOf("://") + 3) + 1);
serverPath += path + "/";
baseHref.Attributes["href"] = serverPath;
//找到form元素,并给action赋绝对路径
HtmlForm myForm = null;
foreach (Control c in Controls)
{
if("HtmlForm".Equals(c.GetType().Name))
{
myForm = (HtmlForm)c;
break;
}
}
myForm.Action = Request.Url.ToString();
}
3.内容页添加有相对路径,或使用有相对路径的跳转时。
后台 Request.Url.ToString().Substring(0, Request.Url.ToString().LastIndexOf('/')+1)
前台<%= Request.Url %>/../
获得当前内容页所在目录。