什么是创建数据并将数据绑定到下拉列表的更有效方法?

时间:2012-07-10 20:30:02

标签: c# asp.net

我想加快我一直在努力的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只是一个简单的类,用于分隔名字,姓氏和全名的值。

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

2 个答案:

答案 0 :(得分:2)

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

二。经理多久改变一次?可能不常见。我建议将其存储在asp.net Cache中。哎呀,你可能想把它缓存在Global.asax Application_Start中。否则,第一个访问该页面的人将受到性能影响。但是,当有人访问该页面时,加载它肯定要好得多。然后,如果需要,可以在页面上关闭视图状态。

下一步。我认为你使用AD的方式非常低效。你在循环中为每个员工打电话。你这样做的唯一原因是要知道他们是否是经理。而不是这样做,找出所有经理人是谁。换句话说:致电AD以获得您关心的团体成员。请参阅此问题:get all users from a group in Active Directory,了解如何查找AD组的所有成员。我怀疑这对性能真的很有帮助。

答案 1 :(得分:1)

一个简单的改进是只加载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中放置您想要呈现部分回发响应的所有控件 < / p>

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

您可以查看以下问题,以便更详细地使用UpdatePanel控件

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

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