【问题标题】:what is a more effecient way to create and bind data to a dropdownlist?什么是创建数据并将数据绑定到下拉列表的更有效方法?
【发布时间】:2012-07-11 04:50:45
【问题描述】:

我想加快我一直在从事的 asp.net 项目的加载时间。其中一个dropdownlists 是一个经理列表,它是通过将sql 表中的员工列表与Active Directory 成员资格进行比较而获得的。

这是从Page_Load调用的

        SqlDataSource empDB = (SqlDataSource)Page.Master.FindControl("EmployeeData");
        DataView dv = (DataView)empDB.Select(DataSourceSelectArguments.Empty);

        foreach (DataRowView drv in dv)
        {
            employeeList.Add(new Employee(int.Parse(drv["EMP_ID"].ToString()), drv     ["FULL_NAME"].ToString()));
        }

        managerTest();

        managerDropDownList.DataSource = managerList;
        managerDropDownList.DataTextField = "fullName";
        managerDropDownList.DataValueField = "emp_Id";
        managerDropDownList.DataBind();

经理测试方法:

     private void managerTest()
    {

        PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "the_domain");
        GroupPrincipal managersGroup = GroupPrincipal.FindByIdentity(domainContext, "Managers and Supervisors");
        GroupPrincipal offManagersGroup = GroupPrincipal.FindByIdentity(domainContext, "Office Managers");
        GroupPrincipal executivesGroup = GroupPrincipal.FindByIdentity(domainContext, "Executives");
        GroupPrincipal managers2Group = GroupPrincipal.FindByIdentity(domainContext, "Managers");

        foreach (Employee emp in employeeList)
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, emp.fullName);

            if (user != null)
            {
                if (user.IsMemberOf(managersGroup) || user.IsMemberOf(offManagersGroup) || user.IsMemberOf(executivesGroup) || user.IsMemberOf(managers2Group))
                {
                    managerList.Add(emp);
                }
            }
        }

    }

Employee 只是一个简单的类,用于分隔名字、姓氏和全名的值。

问题是页面加载速度非常慢,并且页面上有几个控件回发并导致回发需要很长时间。我可以做些什么来提高这项工作的效率吗?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    几件事。第一的。您应该将您在 page_load 中发布的所有代码包装在 if (!IsPostBack) 中。您只需要绑定一次,而不是每次加载页面。除非你当然关闭了视图状态。

    第二。经理多久更换一次?可能不会那么频繁。我建议将其存储在 asp.net Cache 中。哎呀,你可能想在Global.asaxApplication_Start 中缓存它。否则,第一个访问该页面的人将受到性能影响。但这肯定比每次有人访问该页面时都加载它要好得多。然后,您可以根据需要关闭页面上的视图状态。

    接下来。我认为您使用 AD 的方式非常低效。您正在循环中为每个员工调用它。你这样做的唯一原因是要查明他们是否是经理。与其那样做,不如先找出所有经理是谁。换句话说:调用 AD 以获取您关心的组的成员。请参阅此问题:get all users from a group in Active Directory,了解如何找到 AD 组的所有成员。我怀疑这真的有助于提高性能。

    【讨论】:

    • 我不得不对其进行一些修改,但改变从 AD 获取列表管理器的方式确实有很大帮助。研究在 Global.asax 中实现缓存查询数据。
    【解决方案2】:

    一个简单的改进是只加载一次您的DropDownList,然后依靠页面的视图状态来维护其状态,只需将以下检查添加到您的页面:if (!this.IsPostBack)

    if (!this.IsPostBack)
    {
           SqlDataSource empDB = (SqlDataSource)Page.Master.FindControl("EmployeeData");
            DataView dv = (DataView)empDB.Select(DataSourceSelectArguments.Empty);
    
            foreach (DataRowView drv in dv)
            {
                employeeList.Add(new Employee(int.Parse(drv["EMP_ID"].ToString()), drv     ["FULL_NAME"].ToString()));
            }
    
            managerTest();
    
            managerDropDownList.DataSource = managerList;
            managerDropDownList.DataTextField = "fullName";
            managerDropDownList.DataValueField = "emp_Id";
            managerDropDownList.DataBind();
    }
    

    问题是页面加载速度非常慢,页面上有几个控件回发并导致回发需要很长时间

    我认为在这种情况下,如果您使用 AJAX,您的页面响应能力将会得到改善。

    在没有UpdatePanel 控件的情况下实现 AJAX 将为您提供最佳的 UI 性能,但是您需要更改一些内容才能使其正常工作

    您可以使用UpdatePanel 控件来执行部分更新感知性能会提高,因为您不会写完整的帖子,而且学习曲线确实与实现纯 AJAX 调用相比要小。

    进行部分页面回发的基本步骤是:

    • 向 ASPX 页面添加一个ScriptManager 控件(使用UpdatePanel 的每个页面都必须有一个ScriptManager 控件)

    • 在您的 ASPX 页面中创建一个UpdatePanel,并在其ContentTemplate 中放置您想要作为部分回发响应的一部分呈现的所有控件

    • 像在正常的完整回发中一样创建服务器事件

    UpdatePanel控件的更详细使用可以查看以下问题

    How to work with two update panels on same .aspx page

    作为参考,请查看以下文章:

    【讨论】:

    • 我尝试过使用和不使用 (!Page.IsPostBack) 并没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多