在Page_Load中禁用特定LI元素的ASP.NET技术问题咨询
问题场景
我有一个全站通用的ASP.NET母版页,其中包含用户导航菜单,需要在Page_Load事件中根据当前登录用户状态,禁用「用户信息/修改密码」这个菜单项(无登录时不可点击)。
菜单的HTML结构如下:
<ul class="nav navbar-top-links navbar-right"> <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" href="#"> <i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i> <asp:Label runat="server" ID="lblUserName" Text="User Name Here" /> </a> <ul class="dropdown-menu dropdown-user"> <li> <a href="ChangeLoggedInUserPassword.aspx" runat="server" id="UserInfoLink"> <i class="fa fa-user-md fa-fw"></i> <asp:Label runat="server" ID="UserInfoStatement" Text=" User information/change password" /> <!-- 想要禁用这个菜单项 --> </a> </li> <li> <a href="login.aspx"> <i class="fa fa-sign-out fa-fw"></i> <asp:Label runat="server" ID="LogoutLabel" Text=" Logout" /> </a> </li> </ul> </li> </ul>
我在Page_Load中编写了逻辑,但调试时逻辑符合预期,页面加载后该菜单项仍可点击。尝试禁用UserInfoStatement和UserInfoLink都无效,给UserInfoLink添加OnClick仅支持客户端JS,想知道还有哪些可行方案。
后台VB代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then Dim greetingText As String = "Hello " Dim userName As String = "Guest" Try Dim currentTime As DateTime = DateTime.Now Select Case currentTime.Hour Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 greetingText = "Good Morning, " Case 12, 13, 14, 15, 16, 17 greetingText = "Good Afternoon, " Case 18, 19, 20, 21, 22, 23 greetingText = "Good Evening, " End Select Dim memberUser As MembershipUser = Membership.GetUser() If memberUser Is Nothing Then greetingText = "Please Sign In" userName = "" UserInfoStatement.Enabled = False UserInfoStatement.ForeColor = Drawing.Color.Gray LogoutLabel.Text = " Login" Else UserInfoStatement.Enabled = True UserInfoStatement.ForeColor = Drawing.Color.Black LogoutLabel.Text = " Logout" End If Try userName = memberUser.UserName Catch ex As Exception Log(String.Format("Navbar error getting user name: {0}", ex)) End Try Catch ex As Exception Log(String.Format("Navbar error creating greeting string: {0}", ex)) End Try End If End Sub
可行解决方案
方案1:修改链接属性并添加禁用样式
ASP.NET的<a runat="server">禁用时不会自动阻止跳转,可直接修改链接地址并添加CSS禁用样式,既阻止跳转又直观提示用户:
在后台无登录判断分支中添加:
UserInfoLink.Href = "#" UserInfoLink.Style.Add("pointer-events", "none") UserInfoLink.Style.Add("color", "#ccc")
登录状态恢复时还原:
UserInfoLink.Href = "ChangeLoggedInUserPassword.aspx" UserInfoLink.Style.Remove("pointer-events") UserInfoLink.Style.Remove("color")
方案2:替换为asp:LinkButton控件
将原有<a runat="server">替换成asp:LinkButton,该控件的Enabled属性会直接生效,自动阻止点击:
修改前端代码:
<li> <asp:LinkButton runat="server" ID="UserInfoLink" PostBackUrl="ChangeLoggedInUserPassword.aspx"> <i class="fa fa-user-md fa-fw"></i> <asp:Label runat="server" ID="UserInfoStatement" Text=" User information/change password" /> </asp:LinkButton> </li>
后台直接设置状态:
' 无登录时 UserInfoLink.Enabled = False UserInfoLink.ForeColor = Drawing.Color.Gray ' 登录时 UserInfoLink.Enabled = True UserInfoLink.ForeColor = Drawing.Color.Black
方案3:直接隐藏菜单项(可选)
如果不需要给未登录用户展示该选项,可直接隐藏整个列表项:
给<li>添加服务器端属性:
<li runat="server" ID="UserInfoLi"> <a href="ChangeLoggedInUserPassword.aspx" runat="server" id="UserInfoLink"> <!-- 内容不变 --> </a> </li>
后台判断控制可见性:
' 无登录时 UserInfoLi.Visible = False ' 登录时 UserInfoLi.Visible = True
内容的提问来源于stack exchange,提问作者Michael Foster
相关产品推荐
相关产品推荐

