2010-04-19 40 views
2

我试图做的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时应该调用该方法...

有人有一个想法,为什么?

在此先感谢!


编辑:就像一个精度一样,所有这些代码都在masterpage中。


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 

的问题是现在的单击事件并不总是被解雇。在第一次点击时,没有任何反应,但在第二次点击标签时,点击事件被正确触发。任何线索?

编辑3:每次重新载入主页面(我的意思是,每个链接指向一对masterpage +内容页面),是否可以重置存储在隐藏字段中的值?

回答

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但在此之前发生的):

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 

此外,如果有很多了LinkBut​​ton,你可能要像声明:

<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 
+0

谢谢夸格兰!你的解决方案很好,但我仍然遇到问题......我注意到点击事件并不总是被解雇......你知道它为什么会发生吗?通常情况下,第一次点击并不会被考虑在内,但第二次点击则可以。 我会更新我的帖子以反映我所做的更改,以便您可以查看我是否做错了什么。再次感谢;-) – Shimrod 2010-04-20 08:50:08

+0

使用跨页面回发使事情变得复杂一点...您会注意到,每次点击不同页面的链接时,点击事件都不会触发,但如果您点击相同页面的链接,点击事件将会触发。 这是因为跨页面回发实际上是目标页面上的新请求(即,不是真正的回发)。您可以使用Page.PreviousPage访问前一页的详细信息。您可以使用Page.IsCrossPagePostback检查是否发生了跨页面回发。 所以这就是...解决方案的不确定 – Beno 2010-04-20 11:59:30

+0

好的谢谢你的解释,这就是我担心的......我滥用了“”组件吗?跨页面回发不是我所需要的,所以,如果有另一种方式去另一个页面,并保持点击事件,这将是值得欢迎的!否则,也许我应该打开一个新问题,询问“如何制作不使用多视图的选项卡式菜单”:-) – Shimrod 2010-04-20 12:56:12

2

您需要使用<%= ... %>(即将#替换为=)。

哈希表与数据绑定一起使用,您只需创建输出。

对于.NET 4,更喜欢<%: ... %>(使用冒号)自动执行HTML编码。如果你是用在适当的时候在你做LinkButton1.DataBind()代码隐藏OK

+0

嗨理查德,感谢您的快速回答。我只是试过,没有更多的成功...该功能仍然不能通过使用'<%= %>'表示法来访问。 顺便说一句,为什么编译器在这里接受这个语法?我认为我不能在''标签内使用这些标签。 – Shimrod 2010-04-19 14:45:45

+0

@Shimrod:如果编译器不接受,你会在客户端看到'<%...%>'。如果它不起作用,那么有更深的错误。你能否用完整的.aspx(和后面的代码)来更新问题,而不需要显示问题的进一步依赖关系? – Richard 2010-04-19 16:12:20

+0

我不明白,我无法重现我之前的行为......但我确定编译器告诉我,我使用的'<% %>'不能放在''标签...奇怪... – Shimrod 2010-04-20 09:20:15

0

<%# ... %>会工作。

+0

克里斯。但我不觉得这种方法“性感”,如果可能的话我宁愿尝试另一种方式(考虑到现在我只有8个选项卡,但它可能包含更多的选项......)。此外,这样做似乎阻止我的代码访问click事件后面的代码(我也将使用它)。 – Shimrod 2010-04-19 15:12:27

1

在代码隐藏设置的CssClass。如果您使用数据绑定语法,这将比您在链接按钮上调用DataBind更清楚地说明您的意图。由于您正在为多个控件执行此操作,因此可以将它们粘贴到名为ApplyCssClasses的方法中。

+0

感谢您的建议,我会尝试更频繁地分离我的代码。 (我不习惯网络开发......) – Shimrod 2010-04-20 10:11:18

1

我不知道为什么<%=%>不工作,但我个人不喜欢混合代码和标记,我喜欢让他们完全分开。

我会建议在页面加载事件的代码中设置CSS类。

lnkPopulate。CssClass =“current”