嗯,ASP.NET 从页面的“视点”解释相对链接,所以如果页面在文件夹中,您的母版页相对链接将不再起作用。
这是我使用的解决方案,将您的头部内容包装在一个自定义控件中,该控件将执行 rebase:
<asp_custom:RebasingContainer ID="mainRebase" runat="server">
</asp_custom:RebasingContainer>
for 并使用 runat=server 并像这样使用它们:
<link rel="stylesheet" type="text/css" href="~/css/reset.css"/>
注意“~”,它是 ASP.NET “从根开始”的路径。
对于控件,使用这个:
[ControlBuilder(typeof(RebasingContainerBuilder)),
Designer("System.Web.UI.Design.ControlDesigner, System.Design, " +
"Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
ConstructorNeedsTag(false)]
public class RebasingContainer : HtmlGenericControl
{
public RebasingContainer()
{
}
protected override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
{ /*doesn't render it's own tag*/ }
protected override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
{/*doesn't render it's own tag*/}
}
该控件使用以下控件生成器:
public class RebasingContainerBuilder : ControlBuilder
{
public override bool AllowWhitespaceLiterals()
{
return false;
}
public override Type GetChildControlType(string tagName, System.Collections.IDictionary attribs)
{
if (string.Equals(tagName, "link", StringComparison.OrdinalIgnoreCase))
{
return typeof(HtmlLink);
}
if (string.Equals(tagName, "script", StringComparison.OrdinalIgnoreCase)
&& attribs.Contains("src"))
{
//only rebase script tags that have a src attribute!
return typeof(HtmlScript);
}
return null;
}
}
脚本在哪里:
public class HtmlScript : HtmlGenericControl
{
public HtmlScript() : base("script") { }
public HtmlScript(string tag) : base(tag) { }
public string Src
{
get
{
return this.Attributes["src"];
}
set
{
this.Attributes["src"] = value;
}
}
protected override void RenderAttributes(HtmlTextWriter writer)
{
Src = ResolveClientUrl(Src);
base.RenderAttributes(writer);
}
}
在 web.config 中注册您的客户变基控制,然后您就可以开始了。例如:
<add assembly="__code" namespace="CustomControls" tagPrefix="asp_custom" />
如果您使用 AppCode 文件夹。
此解决方案将为您提供运行时以及对分离的主网页和简单网页的设计时支持。