“内联”函数调用:函数永不被击中

时间:2010-04-19 14:36:39

标签: asp.net vb.net

我正在尝试为我正在开发的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:每次重新加载母版页时,是否会重置存储在隐藏字段中的值(我的意思是,每个链接都指向一个母版页+内容页)?

5 个答案:

答案 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中,因为我使用LinkBut​​ton点击事件来设置隐藏字段值(并在加载后但在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()将会正常工作。