【发布时间】:2008-11-21 22:44:30
【问题描述】:
在 ASP.NET(不是 MVC)中,以编程方式在用于导航的无序列表上设置样式的最佳方法是什么,以便在查看该页面时将相应的菜单项设置为活动项?
这很可能与 MasterPage 结合使用。
【问题讨论】:
在 ASP.NET(不是 MVC)中,以编程方式在用于导航的无序列表上设置样式的最佳方法是什么,以便在查看该页面时将相应的菜单项设置为活动项?
这很可能与 MasterPage 结合使用。
【问题讨论】:
您的问题的答案在很大程度上取决于您如何实现列表{用户控制与否等}。我会怎么做,是实现由用户控件生成的列表。
我会为每个元素添加 UserControl 标记,例如:
<{...} class="GeneratedMenuItem"> {...}
我会在样式表中有适当的样式;当然,如果它在用户控件中,那么您也许可以使用主题(但这取决于您使用的 ASP.net 版本。
【讨论】:
好问题,自从 asp 的糟糕时代以来,我已经尝试过各种方法来做到这一点,但我还没有找到完美的锤子。
一般来说,我使用 Request.Url.AbsoluteUri(或类似的)作为渲染函数的参数,并且通常在适当的节点上设置“当前”或类似的 css 类,以及渲染子节点根据需要。
我最常使用 xml/xsl 组合,它通常可以在大多数 cms 平台上工作,尽管我从未对启动 xsl 转换以输出导航列表的开销感到满意,但如果你知道 xsl,是一个非常好的生成 html 的工具,并且你总是可以缓存输出 - 对于偶尔出现的小型静态 html 站点,我经常在构建过程中使用这种方法来呈现静态菜单标记。
也使用过几次 aspnet 站点地图功能,如果您使用 css 友好的适配器,这非常好 - 默认呈现使标记非常难看。
我在本周早些时候发现了这篇文章:http://blog.devarchive.net/2008/01/auto-generate-strong-typed-navigation.html,它使用 t4 模板创建了一个强类型导航类,我肯定会进一步调查。
【讨论】:
我采用这种方法的方式是为母版页中的每个导航项创建 ASP.NET 超链接控件。
然后,我在母版页中创建了一个公共方法,该方法将适当的“选定”CSS 样式分配给我指定的控件:
Public Sub SetNavigationPage(ByVal MenuName As String)
DirectCast(Me.FindControl(MenuName), HyperLink).CssClass = "MenuCurrent"
End Sub
然后在我的内容页面中,我只需要相应地引用母版页。
Dim myMaster As EAF = DirectCast(Me.Master, EAF)
myMaster.SetNavigationPage("hypSearchRequest")
这让我可以灵活地在各个页面上添加/删除导航项,并且还能够在必要时将多个页面分配给管理员导航选项。
值得注意的是,引用超链接控件和设置 Visibility 属性(用于隐藏管理页面)不起作用。这是由于主页面和内容页面的加载顺序。相反,我创建了另一个 CSS 类,它简单地设置了可见性属性并使用了与上面相同的方法。
【讨论】: