【问题标题】:Problems displaying aspx pages in different folder than master page在与母版页不同的文件夹中显示 aspx 页面时出现问题
【发布时间】:2011-09-13 22:00:02
【问题描述】:

我有一个使用一些 JQuery 脚本的站点母版页,当我的站点访问我的帐户文件夹中的任何内容时,页面加载但并非没有错误消息以及混乱的母版页。如果我从帐户文件夹中拉出页面,它工作正常。尝试了一整天来解决这个问题,但无济于事。感谢提供的任何帮助。谢谢!

【问题讨论】:

  • 定义“错误消息”和“混乱的母版页”。我们需要有关问题的实际信息。
  • 点击访问“帐户”页面中的任何页面时,会弹出“网页错误”并显示错误“您要调试此网页吗?此网页包含可能阻止其显示或正常工作的错误. 下面是一个错误文本框: Line:76 Error: '$' is undefined
  • 你仍然需要在这里做一些基本的调试,因为我们看不到你的代码(特别是第 76 行)。听起来这是一个 JavaScript 错误。您可以使用 FireBug 之类的调试器来单步调试 JavaScript,查看对象的状态以及引发错误的代码。 编辑:根据错误消息,听起来代码在加载 jQuery 库之前尝试使用 jQuery。
  • 我认为这是一个相对链接问题,当您在一个地方有母版页,而在文件夹或其他地方有内容页面(路径不同)我已经发布了我用于此的解决方案跨度>

标签: c# jquery asp.net css master-pages


【解决方案1】:

这与您指向 CSS 和 JavaScript 的链接有关。确保添加“../”以提升文件夹结构的级别。

【讨论】:

  • 这将破坏使用该文件夹外的母版页的每个页面
  • 外面的页面似乎没有受到影响。
【解决方案2】:

我认为可能存在安全问题

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

阅读:Setting authorization rules for a particular page or folder in web.config

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

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

【讨论】:

    【解决方案3】:

    我们真的没有足够的信息来在这里提供明确的答案 - 例如,您所说的“错误消息”是什么意思?来源是什么?它是如何显示的?而且,最重要的是,它说了什么?如果您取消使用 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>
    

    【讨论】:

      【解决方案4】:

      嗯,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 文件夹。

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

      【讨论】:

      • CSS 链接的简单/ 前缀无论如何都是从根开始的,无需调用.NET 来扩展路径。
      • 感谢失望先生,是CSS和JS文件链接前的/前缀遗漏导致问题!
      • @Mr Disappointment 仅当资源位于站点根目录中时才有效,这对于许多网站而言并非如此。如果您有 localhost/TestSite/Folder1/default.aspx,其中 TestSite 是您的站点的名称,并且在 root 中是 master,那么在 Folder1 中使用该 master 的内容 -> 将不起作用。
      • @Denis:不,它根目录工作,所以可以在子文件夹中,例如:/resources/resource1.css,其中第一个 / 代表根。
      • 也许我解释得不对——站点根目录是指站点地址不在域“根目录”中,就像拥有 localhost/TestSite 一样,其中 TestSite 是虚拟目录的名称。在这种情况下,这将不起作用,因为 /resources/resource1.css 将提供 localhost/resources/resource1.css 而不是 localhost/TestSite/resources/resource1.css
      【解决方案5】:

      只需使用这个:

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

      &lt;script src="/js/jquery.js" type="text/javascript"&gt;&lt;/script&gt;

      从这里引用: Using JQuery in a Subfolder When the MasterPage is in the Root Folder

      【讨论】:

        【解决方案6】:

        如果您的子文件夹中有 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>
        

        提示:如果您无法使一个文件夹或另一个文件夹正常工作,请使用:~//.././,其中一个会为您提供参考。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          相关资源
          最近更新 更多