【问题标题】:How to hide a control and prevent control from loading data如何隐藏控件并阻止控件加载数据
【发布时间】:2026-01-09 20:35:02
【问题描述】:

我有一个页面,其中包含以下自定义控件代码:

<SiteControls:Announcements runat="server" id="UserAnnouncements" />

假设我有一个 GridView 控件,这样我就可以涵盖多个场景。我需要通过检查布尔值来检查用户是否有权查看此控件:

PermissionsManagement.DoesUserHavePermission(userId, permissionId)

定义为:

public static class PermissionsManagement
{
    public static bool DoesUserHavePermission(int userAccountId, int permissionId)
    {
        // Code Goes Here
    }
}

如果用户没有权限,DoesUserHavePermission 将返回 false。我的 ASP.NET WebForms 页面的布局就像用户拥有完全控制权一样(这意味着我拥有页面上的所有控件,如果他们没有权限,我希望将它们删除,而不是向页面添加每个控件)。

如果用户没有权限,我可以在 Page_Load 函数上将控件的可见性设置为 false,但这不会阻止我的控件加载或 GridView 加载其数据的情况。如果用户无权使用(查看)控件,我如何阻止控件(用户控件或标准控件)加载任何数据?我尝试了以下行不通的内联代码:

<% if(PermissionsManagement.DoesUserHavePermission(1, 1))
   { %>
        <SiteControls:Announcements runat="server" id="UserAnnouncements" />
<% } %>

但这不起作用,因为控件 Page_Load 仍然会为控件触发,并且我假设任何其他控件如果是数据绑定的或与我的控件类似的行为都会加载数据。

【问题讨论】:

    标签: c# asp.net webforms controls


    【解决方案1】:

    在不了解您的代码的情况下,很难找出确切的答案。但是,据我了解您的问题,这是我的答案。

    AnnouncementsGridView 的加载数据仍应由您控制。我将在 Announcements 控件中公开一个实际为其加载数据的方法。对于 GridView,您应该简单地将 DataSource 的绑定推迟到执行权限检查。当然,除了隐藏(设置可见性)这些控件之外,还需要做这些事情。

    看下面的代码,不完整,但足以表达一个想法:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Check permissions here
            if (allowed) 
            {
                // For custom/user control
                UserAnnouncements.GetAnnouncements();
                // For grid view
                GridView1.DataSource = GetGridviewData(); // GetGridviewData would return DataSet or anything valid.
                GridView1.DataBind();
            }
            else
            {
                // Hide the controls
            }
        }
    }
    

    【讨论】:

      最近更新 更多