我试图使用以下代码基于用户的角色隐藏按钮:
<asp:Button ID="btndisplayrole" Text="Admin Button" Visible='<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>' runat="server" OnClick="DisplayRoleClick" />
但是,当我运行上面的代码时,我收到以下错误消息:
无法从其字符串表示形式'<%= WebApplication1.SiteHelper.IsUserInRole(“Admin”)%>'为'Visible'创建'System.Boolean'类型的对象
一种有趣的问题..但是正如错误消息所述,字符串<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>
无法转换为布尔值。
不幸的是,我无法解释为什么表达式没有被评估,而是被视为字符串。
你的<%# %>
表达式按预期工作的原因是因为它的处理方式大不相同。将Page编译成类时,编译器会创建一个类似于此的事件处理程序:
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所建议的那样转向代码隐藏。
作为替代解决方案:
<% if (WebApplication1.SiteHelper.IsUserInRole("Admin"))
{%>
<asp:Button ID="btndisplayrole"
Text="Admin Button"
runat="server"
OnClick="DisplayRoleClick" />
<%} %>
以下代码有效:
Visible='<%# WebApplication1.SiteHelper.IsUserInRole("Admin") %>'
注意以上使用绑定表达式!
如何在代码隐藏中执行此操作,例如在Page_Load上?
public void Page_Load( object sender, EventArgs e )
{
btndisplayrole.Visible = WebApplication1.SiteHelper.IsUserInRole("Admin");
}
Visible='<%= WebApplication1.SiteHelper.IsUserInRole("Admin").ToString() %>'
要么
Visible=<%= WebApplication1.SiteHelper.IsUserInRole("Admin") %>