为什么在这种情况下 User.IsInRole 不起作用?

3
我希望在用户为管理员时显示“删除”按钮,在用户为贡献者时显示“添加项目”按钮。请见以下内容:

...

<!-- 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>

删除按钮的“visible”属性正常工作。但是,“添加项目”的超链接不起作用。它总是显示。 查看源代码告诉我,%# User.IsInRole(@"DOMAIN\CMDB_CONTRIBUTE") %> 没有评估任何内容。你知道这是为什么吗?

2个回答

2

尝试在后端代码中设置它,而不是在标记中,在Page_Load方法中。假设id为promptTable(在您的示例中没有给出),只需添加:

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

据推测,不管是回传(postback)还是非回传,都需要完成这个任务。

顺便说一下,@Keltex关于控件没有被数据绑定(databound)的观点是正确的,因此<%# %>无法使用。不幸的是,<%= %>语法也无法使用,因为它总是返回一个字符串,而你需要一个布尔值。我在这种情况下找不到其他可用的语法。您可以通过JavaScript关闭显示来完成此操作,但我怀疑如果未处于正确的组中,您不希望将表格呈现到页面上(而不仅仅是在客户端上隐藏或从DOM中删除)。我认为在后端代码中完成这项任务是正确的方法。


1

尝试:

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

asp:table似乎没有绑定数据。


错误1 无法从其字符串表示形式 '<%= User.IsInRole(@"DOMAIN\CMDB_CONTRIBUTE") %>' 创建类型为 'System.Boolean' 的对象,用于 'Visible' 属性。 - Kolten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接