访问模板中代码隐藏中的控件

Access a control in Codebehind that's in a Template

在我使用脚手架的 ASP.NET WebForms 应用程序中,我有许多页面需要根据用户的角色限制某些链接。 例如,在我的 Site.Master 和我的 <LoggedTemplate> 以及其他 <li> 中,我还有一个用于管理页面的 <li>。默认情况下,这是不可见的,但如果用户以管理员身份登录,那么我希望它可见。我做不到。这是它的代码:

            <LoggedInTemplate>
                <ul class="nav navbar-nav">
                    <li><a runat="server" id="adminLink" visible="false" href="~/Admin/Admin_Page">Admin</a></li>
                    <li><a runat="server" href="~/Inquiries/Default.aspx">Inquiry</a></li>

在我的代码隐藏中,在 Page_Load 中,我无法仅访问 adminLink

同样,在 ModelDefault 页面之一中,该列表具有指向查看、插入和删除的链接。如果用户是管理员,那么只有我想显示插入和删除链接。这是它的代码:

       <td>
            <asp:HyperLink runat="server" NavigateUrl='<%# FriendlyUrl.Href("~/Channels/Details", Item.ChannelId) %>' Text="View" /> |

            <asp:HyperLink runat="server" ID="editLink" NavigateUrl='<%# FriendlyUrl.Href("~/Channels/Edit", Item.ChannelId) %>' Text="Edit" /> | 
            <asp:HyperLink runat="server" NavigateUrl='<%# FriendlyUrl.Href("~/Channels/Delete", Item.ChannelId) %>' Text="Delete" />

        </td>
    </tr>
</ItemTemplate>

我尝试添加

<% if (CommonUtilities.IsUserAdmin) { %>
hyperlinks for Insert & delete & finally 
<% } %>

但这给出了错误。我将 ID 添加到 editLink,但同样无法在 Page_Load 方法中访问它。

我敢肯定,他们一定是某种解决这个问题的方法,但我还没有找到。 如何处理这个问题??请帮助我,我有几个页面和链接可以根据管理员角色隐藏和显示。

非常感谢任何帮助。

谢谢

我想你在找 FindControl。例如:

Label adminLabel = LoggedInTemplate.FindControl("adminLink") as Label;
adminLabel.visible = true;

在一些模板中对我有用,虽然我不了解 LoggedInTemplate,但不明白为什么不这样做。

编辑:没有意识到你在使用 <a>。不确定为什么要混合使用 asp 超链接和 html,但无论如何,逻辑仍然相同。

感谢 WEDEBE 指出混合 <a> 和 。 那一点给了我一条出路。在我的设计中,我将 <a> 更改为 <asp:HyperLink> 并从代码隐藏中删除了代码。仅在设计中,我尝试检查用户的 hte 角色,然后添加完整的 <li>。像这样:

   <LoggedInTemplate>
        <ul class="nav navbar-nav">
           <% if (VincitoreCRMApplication.CommonUtilities.IsCurrentUserAdmin)
            { %>
             <li> <asp:HyperLink runat="server" id="adminLink" NavigateUrl="~/Admin/Admin_Page.aspx">Admin</asp:HyperLink>  </li>
           <% } %>
            <li><a runat="server" href="~/Inquiries/Default.aspx">Inquiry</a></li>

对于其他 2 个 HyperLink,我也是这样做的:

    <% if (VincitoreCRMApplication.CommonUtilities.IsCurrentUserAdmin)
   { %>

        <asp:HyperLink runat="server" ID="editLink" NavigateUrl='<%# FriendlyUrl.Href("~/Channels/Edit", Item.ChannelId) %>' Text="Edit" /> | 
         <asp:HyperLink runat="server" NavigateUrl='<%# FriendlyUrl.Href("~/Channels/Delete", Item.ChannelId) %>' Text="Delete" />
    <% } %>                       

这很有效。但是我意识到一件事,当我添加

  <% if (VincitoreCRMApplication.CommonUtilities.IsCurrentUserAdmin) { %>

像这样,在一行中,它不起作用。但是在新行中添加花括号时,它起作用了。我知道这听起来很奇怪,我也搞不懂为什么会这样。但这是我所面对和学到的事实。

我知道这是很简单的事情,但为了以防万一我的代码对任何人有帮助,已在此处分享。

谢谢