我想加快我一直在努力的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只是一个简单的类,用于分隔名字,姓氏和全名的值。
问题是页面加载速度非常慢,并且页面上有几个回发并且导致回发需要很长时间的控件。我有什么办法可以让这项工作更有效率吗?
答案 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
作为参考,请看以下文章: