我有一个母版页,上面有一个菜单。菜单的 C# 代码位于用户控件中,该控件在运行时创建,用户权限存储在 DB 中。当前在每个页面请求或回发菜单上创建。由于菜单创建使用 DB 调用
我担心的是,我可以在每个请求上阻止这个数据库调用吗?意味着当用户第一次登录时,我将为用户的许可进行数据库调用,然后将为每个请求创建菜单,或者回发没有数据库调用菜单。
菜单用户控制的输出缓存是否适用于我的场景?
我有一个母版页,上面有一个菜单。菜单的 C# 代码位于用户控件中,该控件在运行时创建,用户权限存储在 DB 中。当前在每个页面请求或回发菜单上创建。由于菜单创建使用 DB 调用
我担心的是,我可以在每个请求上阻止这个数据库调用吗?意味着当用户第一次登录时,我将为用户的许可进行数据库调用,然后将为每个请求创建菜单,或者回发没有数据库调用菜单。
菜单用户控制的输出缓存是否适用于我的场景?
您可以在登录期间将检查存储在会话变量本身中。
每次页面加载时,您只需要检查会话变量。
如果您有问题,请告诉我。
在 page_load 方法中使用Page.IsPostBack属性。
例如:
private void Page_Load()
{
if (!IsPostBack)
{
// Do anything here you want to only happen when
// the page is loaded 1st time
// such as hit the database for the menu...
CreateMenu();
}
}
如果你把你的菜单变成一个用户控件,你可以使用缓存(通过参数)来缓存每个用户的菜单,但只有在你测试了逻辑之后才添加这个,因为当你有缓存时调试可能会很棘手。
编辑 - 对评论的响应将
您的菜单创建为用户控件,然后使用控件输出缓存,以确保在用户登录时为他们创建并在此之后将其保存在缓存中。如果您的菜单在用户访问期间没有更改,那么您可以拥有相当激进的缓存,否则如果您的菜单需要响应所做的更改(可能是管理员授予用户另一个菜单项),那么您可以缓存直到更改在数据库中检测到。
另请参阅有关ASP.NET 页面的缓存部分的 MSDN 文档,了解有关如何实现部分页面输出缓存的一些示例
我可以建议我在 Web 应用程序中完成的另一件事。我在登录时将整个菜单相关信息放在会话中,然后在该会话的母版页中,我获取了菜单相关信息,而不是每次都去数据库之旅..