Почему User.IsInRole не работает в этом контексте?

... Я хочу показать кнопку «удалить», когда пользователь является администратором, и показать кнопку «добавить элемент», когда пользователь является участником:

<!-- 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") %> ничего не оценивает. Любая идея, почему это так?


person Kolten    schedule 28.10.2008    source источник


Ответы (2)


Попробуйте установить его в коде позади, а не в разметке, в Page_Load. Предполагая, что идентификатор - promptTable (в вашем примере он не указан), просто добавьте:

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

Предположительно это нужно делать вне зависимости от того постбек это или нет.

FWIW, @Keltex прав в том, что элемент управления не привязан к данным, поэтому <%# %> не будет работать. К сожалению, синтаксис <%= %> тоже не будет, потому что он всегда возвращает строку, и вам нужно там логическое значение. Я не смог найти другого синтаксиса, который бы работал в этом случае. Вероятно, вы могли бы сделать это, отключив отображение с помощью javascript, но я подозреваю, что вы не хотите, чтобы таблица отображалась на странице, если она не находится в правильной группе (в отличие от того, чтобы просто быть скрытым или удаленным из DOM один раз на клиент). Делать это в коде позади, я думаю, это правильный способ сделать это.

person tvanfosson    schedule 28.10.2008

Пытаться:

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

Таблица asp: не связана с данными.

person Keltex    schedule 28.10.2008
comment
Ошибка 1. Не удается создать объект типа «System.Boolean» из его строкового представления «‹%= User.IsInRole(@DOMAIN\CMDB_CONTRIBUTE) %›» для свойства «Visible». - person Kolten; 29.10.2008