将按钮的可见属性分配给静态方法结果

10
我尝试使用以下代码根据用户的角色隐藏按钮:
 <asp:Button ID="btndisplayrole" Text="Admin Button" Visible='<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>' runat="server" OnClick="DisplayRoleClick" />

但是当我运行上面的代码时,我会得到以下错误信息:

无法从其字符串表示形式“<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>”创建类型为“System.Boolean”的对象,用于“Visible”

5个回答

8
作为另一种解决方案:
<% if (WebApplication1.SiteHelper.IsUserInRole("Admin"))
    {%>
        <asp:Button ID="btndisplayrole" 
                    Text="Admin Button" 
                    runat="server" 
                    OnClick="DisplayRoleClick" /> 
<%} %>

1
+1 因为发布了关于可见性的解决方法,但我猜 OP 希望使其适用于任何其他控件属性。 - Manitra Andriamitondra

7

这是一个有趣的问题...但正如错误信息所述,字符串<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>无法转换为布尔值。

很遗憾我无法解释为什么表达式没有被评估,而是被视为字符串。

你的<%# %>表达式之所以按预期工作,是因为它被处理得非常不同。当页面编译成类时,编译器会创建一个类似于以下事件处理程序:

public void __DataBindingButton2(object sender, EventArgs e)
{
    Button button = (Button) sender;
    Page bindingContainer = (Page) button.BindingContainer;
    button.Visible = HttpContext.Current.User.IsInRole("admin");
}

该方法将此方法绑定到控件的Control.Databinding事件。如您所见,<%# %> 此时被正确地视为服务器代码,而不仅仅是随机字符串。

因此,我猜解决方案要么使用数据绑定,要么按照AndreasKnudsen的建议转到代码后台。


6
以下代码有效:
Visible='<%# WebApplication1.SiteHelper.IsUserInRole("Admin") %>'

请注意,上述使用了绑定表达式!

2
实际上,上面的代码并不是我所需要的,因为现在我必须绑定页面才能执行代码! - azamsharp

2
只在代码后端执行,例如在Page_Load事件中执行,这样如何?
public void Page_Load( object sender, EventArgs e )
{
   btndisplayrole.Visible = WebApplication1.SiteHelper.IsUserInRole("Admin");
}

-1
Visible='<%= WebApplication1.SiteHelper.IsUserInRole("Admin").ToString() %>'

或者

Visible=<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>

尝试了两种方法,但都没有成功。IsUserInRole返回布尔值。 - azamsharp
抱歉,我根据您遇到的错误编写了我的回复。 - shahkalpesh

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