我正在尝试为我正在开发的asp.net网站制作一个标签式菜单。其中一个先决条件显然是以不同方式为当前选项卡着色,因此用户可以知道当前哪个选项卡。
为此,我在我的代码隐藏中创建了这个方法:
Protected Function GetCssClass(ByVal ctrl As LinkButton) As String
If ctrl.ID = currentLink Then
Return "current"
Else
Return String.Empty
End If
End Function
我在我的aspx页面中调用了这样的方法:
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="/Default.aspx" CssClass="<%#GetCssClass(LinkButton1) %>" >Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="/Directory/page1.aspx" CssClass="<%#GetCssClass(LinkButton2) %>" >Page1</asp:LinkButton>
但该方法永远不会被击中......据我了解,每次绘制LinkButton
时都应该调用该方法...
有人知道为什么吗?
提前致谢!
编辑:就像精度一样,所有这些代码都在母版页中。
Edit2:以下是我根据Quagland's suggestion所做的更改。
在aspx主页中:
<asp:HiddenField ID="currentLink" runat="server" />
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="/Default.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="/OtherDirectory/Page1.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page1</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="/OtherDirectory/Page2.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page2</asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="/OtherDirectory/Page3.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page3</asp:LinkButton>
在后面的代码中:
Protected Sub LinkButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles LinkButton1.Click, LinkButton2.Click, LinkButton3.Click, LinkButton4.Click, LinkButton5.Click, LinkButton6.Click, LinkButton7.Click, LinkButton8.Click
Dim lnk As LinkButton = CType(sender, LinkButton)
currentLink.Value = lnk.ID
End Sub
Protected Function GetCssClass(ByVal ctrl As LinkButton) As String
If ctrl.ID = currentLink.Value Then
Return "current"
Else
Return String.Empty
End If
End Function
Protected Sub LinkButton_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles LinkButton1.PreRender, LinkButton2.PreRender, LinkButton3.PreRender, LinkButton4.PreRender, LinkButton5.PreRender, LinkButton6.PreRender, LinkButton7.PreRender, LinkButton8.PreRender
Dim lnk As LinkButton = CType(sender, LinkButton)
lnk.CssClass = GetCssClass(lnk)
End Sub
问题是现在并不总是触发click事件。在第一次单击时,没有任何反应,但在第二次单击选项卡时,正确触发了单击事件。任何线索?
Edit3:每次重新加载母版页时,是否会重置存储在隐藏字段中的值(我的意思是,每个链接都指向一个母版页+内容页)?
答案 0 :(得分:2)
您需要使用<%= ... %>
(即将#
替换为=
)。
哈希表单与数据绑定一起使用,您只想创建输出。
对于.NET 4,首选<%: ... %>
(使用冒号)自动执行HTML编码。
答案 1 :(得分:1)
在代码隐藏中设置CssClass。如果使用数据绑定语法,这将比在链接按钮上调用DataBind更清楚地表明您的意图。由于您正在为多个控件执行此操作,因此可以将它们粘贴在名为ApplyCssClasses的方法中。
答案 2 :(得分:1)
我不确定为什么&lt;%=%&gt;不行,但我个人不喜欢混合代码和标记,我喜欢将它们完全分开。
我建议可能在页面加载事件中在代码中设置CSS类。
lnkPopulate.CssClass =“当前”
答案 3 :(得分:1)
我已经快速测试了可能适合您的解决方案。我只是不确定你的'currentlink'变量来自哪里。我在这里将其实现为隐藏字段。
在Masterpage.aspx中:
<asp:HiddenField ID="currentLink" runat="server" />
<asp:LinkButton ID="LinkButton1" runat="server">Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server">Page1</asp:LinkButton>
在代码背后: 使用原始的GetCssClass函数添加:
Protected Sub LinkButton_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
Handles LinkButton1.PreRender, LinkButton2.PreRender
Dim lnk As LinkButton = CType(sender, LinkButton)
lnk.CssClass = GetCssClass(lnk)
End Sub
我已将它放在PreRender中,因为我使用LinkButton点击事件来设置隐藏字段值(并在加载后但在PreRender之前发生Click):
Protected Sub LinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles LinkButton1.Click, LinkButton2.Click
Dim lnk As LinkButton = CType(sender, LinkButton)
currentLink.Value = lnk.ID
End Sub
另外,如果有许多链接按钮,您可能需要声明如下:
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender">Home</asp:LinkButton>
修改强> 这是另一个适用于跨页回发的解决方案。代码不多但你需要在每个页面上添加一些代码。无论如何:
Masterpage.aspx:
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="Default.aspx">Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="Page1.aspx">Page1</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="Page2.aspx">Page2</asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="Page3.aspx">Page3</asp:LinkButton>
Masterpage.aspx.vb:
Public Sub SetCssClass(ByVal ctrl As String)
CType(FindControl(ctrl), LinkButton).CssClass = "current"
End Sub
所有内容页面: *的.aspx: 添加此指令以创建对母版页的强类型引用
<%@ MasterType VirtualPath="~/MasterPage.master" %>
* aspx.vb:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Master.SetCssClass("LinkButton1") '' << put the name of the relevant link button here
End Sub
答案 4 :(得分:0)
<%# ... %>
,那么 LinkButton1.DataBind()
将会正常工作。