在与母版页不同的文件夹中显示aspx页时出现问题



我有一个网站主页面,它使用了一些JQuery脚本,当我的网站访问我的Account文件夹中的任何内容时,页面会加载,但不会出现错误消息和混乱的主页面。如果我从"帐户"文件夹中取出页面,效果会很好。花了一整天的时间想弄清楚,但都无济于事。感谢您的帮助。谢谢

这将与CSS和JavaScript的链接有关。请确保添加"../"以在文件夹结构中提升一个级别。

我认为可能存在安全问题

首先确保您在文件中添加了javascript文件的正确实际路径。。。

阅读以下内容:在web.config 中为特定页面或文件夹设置授权规则

允许匿名用户访问Account.aspx页面。复制

<configuration>
   <location path="~/Users>
      <system.web>
         <authorization>
            <allow users="?"/>
         </authorization>
      </system.web>
   </location>
</configuration>

我们实际上没有足够的信息来提供明确的答案,例如,您所说的"错误消息"是什么意思?来源是什么?它是如何显示的?最重要的是,它说了什么?如果您取消使用jQuery,页面会按预期显示和运行吗?

除此之外,为了解释"混乱的MasterPage",我假设您的account文件夹已通过web.config的authorization部分限制访问。这可以进行调整,以允许访问某些资源;在authorization部分,您可能有这样的东西:

<authorization>
    <deny users="?"/>
    <allow users="*"/>
</authorization>

以上操作将锁定对该路径范围内的所有文件的访问。当然,您的登录页面可以访问,但可能无法访问CSS文件和图像等资源-为了允许尚未通过身份验证的用户访问这些资源,您可以配置自定义location,例如:

<location path="pathToResources">
    <system.web>
        <authorization>
            <allow users="?"/>
        </authorization>
    </system.web>
</location>

好吧,ASP.NET从页面的"视点"解释相对链接,所以如果页面在文件夹中,您的母版页相对链接将不再工作。

这是我使用的解决方案,将您的头部内容包装在一个自定义控件中,该控件将执行重基本操作:

<asp_custom:RebasingContainer ID="mainRebase" runat="server">
</asp_custom:RebasingContainer>  

对于并使用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中注册您的客户rebase控件,您就可以开始了。例如:

<add assembly="__code" namespace="CustomControls" tagPrefix="asp_custom" />

如果使用AppCode文件夹。

此解决方案将为您提供运行时以及设计时对分离的主网页和简单网页的支持。

只需使用以下内容:

把/放在js之前就可以了。

<script src="/js/jquery.js" type="text/javascript"></script>

引用自此处:当MasterPage在根文件夹中时在子文件夹中使用JQuery

如果子文件夹中有javascript或jQuery,根文件夹中有页面,子文件夹中也有页面,请执行以下操作:为母版页中的每个javascript文件添加两个链接:

例如:

<script src="Scripts/jquery.js" type="text/javascript"></script>
<script src="../Scripts/jquery.js" type="text/javascript"></script>

工作原理:子文件夹中的页面将被引用到具有../的链接,即

<script src="../Scripts/jquery.js" type="text/javascript"></script>

根文件夹中的页面将被引用到没有../的链接,即

<script src="../Scripts/jquery.js" type="text/javascript"></script>

提示:如果您无法使一个或另一个文件夹正常工作,请使用:~//.././

最新更新