为什么User.IsInRole不在此上下文中工作?

时间:2008-10-28 21:56:22

标签: c# asp.net authentication roles

...我想在用户是管理员时显示“删除”按钮,并在用户是撰稿人时显示“添加项目”按钮:

<!-- More code above -->
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                    <asp:LinkButton CSSClass="TableRightLink" ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Delete"
                        Visible=<%# User.IsInRole(@"DOMAIN\CMDB_ADMIN") %>
                        Text="Delete" 
                        OnClientClick="return confirm('Are you certain you want to delete this item?');"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <SelectedRowStyle VerticalAlign="Top" />
        <HeaderStyle ForeColor="White" CssClass="TableHeader" BackColor="SteelBlue" />
    </asp:GridView>
    <asp:table width="100%" runat="server" CSSclass="PromptTable" Visible=<%# User.IsInRole(@"DOMAIN\CMDB_CONTRIBUTE") %> >
    <asp:tablerow><asp:tablecell HorizontalAlign=Center>
      <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="AddConfigItem.aspx" ForeColor="LightCyan">Add Item</asp:HyperLink>
    </asp:tablecell></asp:tablerow></asp:table>

“删除”按钮“可见”属性正常。但是,“添加项目”超链接不会。它总是显示。 View-source告诉我%#User.IsInRole(@“DOMAIN \ CMDB_CONTRIBUTE”)%&gt;没有评估任何事情。知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

尝试在Page_Load中设置代码,而不是在标记中。假设id是promptTable(在你的例子中没有给出),只需添加:

promptTable.Visible = User.IsInRole(@"DOMAIN\CMDB_CONTRIBUTE");

据推测,无论是否是回发,都需要这样做。

FWIW,@ Kertex对控件不是数据绑定是正确的,因此<%# %>将不起作用。不幸的是,<%= %>语法也不会因为它总是返回一个字符串而你需要一个布尔值。在这种情况下,我找不到任何其他语法。您可以通过使用javascript关闭显示来实现此目的,但我怀疑您不希望将表呈现到页面(如果不在正确的组中)(而不是仅仅隐藏或从DOM中删除一次)客户)。在后面的代码中执行它,我认为是正确的方法。

答案 1 :(得分:1)

尝试:

Visible='<%= User.IsInRole(@"DOMAIN\CMDB_CONTRIBUTE") %>'

asp:table似乎不是数据绑定。