【问题标题】:.net templates which page am I on?.net 模板我在哪个页面上?
【发布时间】:2009-11-10 00:07:15
【问题描述】:

我很想知道使用 .net 2.0 和母版页是否可以找到我所在的页面以便我可以使用它来设置标签的样式?

我的母版页上有一个导航栏,我要做的是:

如果用户,比如在联系页面上,联系页面的选项卡将是不同的颜色,这可以实现吗?我见过一些不使用母版页的示例,当然您可以使用封装的正文标签来表示您的位置,但这不适用于母版页。

谢谢R。

【问题讨论】:

    标签: asp.net css asp.net-2.0 master-pages


    【解决方案1】:

    MasterPage 尽管名称听起来像是使用它的页面的子页面。

    把它想象成一个页面的用户控件。您实际上可以访问 Page 实例及其 Request 属性。

    这是一个关于如何使用它的示例

    switch(Request.Path){
      case "/page1/aspx":
        //dosomething to your tabs
      break:
      case "/page1/aspx":
        //dosomething to your tabs
      break:
      .
      .
      .
      default:
        //dosomething else
      .
      .
      .
    }
    

    【讨论】:

    • 如果他有 100 页会怎样?还是动态 URL 重写?
    • @Russ,是的,应该是switch 而不是select,我在想什么? :P 无论如何,我的代码只是一个示例,它可以使用 Page.Title 或使用查找(如果有的话)。
    • 这个很好理解,如果他是用数据库重写或者有一个页面列表,那么这实际上会是一个非常有效的方法,+1。
    【解决方案2】:

    如果您想从页面更改母版页上的内容(即更改标签颜色),您应该:

    在母版页中,公开一个可以改变标签颜色的属性或方法。

    即:

    public void changecolor(string PageName, string Color){
        switch(PageName){
           case "home":
               this.TabHome.Color=Color;
        }
    }
    

    然后在带有母版页路径的 aspx 页面顶部放置一个指令。像这样:

     <%@ MasterType VirtualPath="~/Site.master" %>
    

    完成此操作后,您可以从代码隐藏中访问母版页并查看其公开的方法,然后只需调用它即可完成。

    protected void Page_Init(object sender, EventArgs e){
        Master.changecolor("home", "red"); 
    }
    

    这样,您不必解析页面名称并处理尝试更改页面名称等时出现的维护问题。您还将案例语句限制为选项卡的数量,而不是数量您网站中的页面数。

    【讨论】:

    • @Russ:我看到您的方法是从页面而不是从母版页触发选项卡。一种不同的方法,但效果也很好。 +1 虽然每个页面和母版页之间会紧密耦合,但根据场景的不同,它可能更容易实现。
    • 是也不是,这种方法确实很难动态地交换母版页,并且根据具体情况,他可能只想使用您的解决方案。在这种情况下,我的和你的都不是“更好的答案”它们只是不同的方法,具有不同的优点和缺点
    • @Russ:完全同意,所以只有他知道答案!哈哈...多么讽刺啊?
    【解决方案3】:

    在您的母版页(或帮助程序类)中创建以下方法,然后在您的母版页的 Page_Load 方法中添加对它的引用:

    public string GetCurrentPageName() 
    { 
        Uri uri = Request.Url; 
        string[] uriSegments = uri.Segments; 
    
        string pageName = "";
    
        if( 0 < uriSegments.Length ) 
        { 
            pageName = uriSegments.Last(); 
        } 
    
        return pageName;
    
    }
    

    }

    这应该给你当前的文件名——你可能还想去掉文件名的“.aspx”部分。我还没有用 QueryString 测试过这个,所以不确定 Last() 在这种情况下是否仍然返回文件名。

    如果您的标签是 asp.net 控件,您可以使用 FindControl() 来查找标签 - 当然,您需要将标签 ID 与您的页面名称相匹配。获得控件后,您可以在代码隐藏中添加“选定”样式。

    【讨论】:

    • 您在使用 System.IO.FileInfo 时没有发现任何可能的性能问题?再加上在 Web 层使用 System.IO 实在是太脏了。如果您使用 uri 段并返回最后一个索引,它可能会获得更好的性能和更清晰的结果,它应该给出相同的结果。
    • 对于一个普通的网络应用程序,我同意当 httpContext 可以提供相同的结果时它是不合适的。当模板文件的名称不用于 URI 而是用于动态样式时,我们不得不在最近的 CMS 项目中使用 FileInfo。
    • 代码现在更新为使用 Request 对象而不是 FileInfo。
    • 这更简洁,尽管正如您在评论中提到的,system.io.fileinfo 将适用于仅在 default.aspx 之外运行并为每个页面加载不同控件的应用程序。我在“YetAnotherForum”等应用程序中看到了这一点
    猜你喜欢
    • 2018-02-08
    • 2013-09-15
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多