我应该将数据缓存或输出缓存用于复杂的导航菜单吗?

Mar*_*nox 11 asp.net asp.net-mvc caching asp.net-mvc-4 asp.net-mvc-5

我试图根据不同的标准缓存导航菜单的各个部分.

例如,新闻和文章需要在持续时间内刷新,而登录和配置文件应该基于每个用户进行缓存.

我正在考虑两种选择 - 是否有人能够对我们各自的利弊有所启发?如果可能的话,建议采取更好的方法!

选项1.

只需将所有必需的html缓存为数据缓存中的字符串.必要时手动检查用户差异.

我(也许是错误的)想象这将是最需要实现的工作,但也是缓存不同部分的最有效方式.

选项2.

为菜单的每个部分安装一个具有不同子操作的NavigationController.(我们可以根据需要对每个子操作应用不同的outputCacheProfile.)

但这需要我们为导航菜单的每个部分调用单独的RenderAction.由于对Phil Haack的一篇博文发表评论,我对此感到担心:

[渲染操作]非常类似于发出另一个请求,因为我们需要运行路由以确保我们有适当的路由数据和上下文来调用操作方法.所以每次调用RenderAction都会加起来.

完整帖子在这里:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

Dav*_*ich 5

我认为这个问题得到了普遍回避,因为这里没有正确的答案.

实际上,您选择用于实现复杂导航的体系结构将决定最佳缓存策略.


我非常偏爱使用子操作导航部分视图.

我同意你的意思,引用文件是更多的工作.我更喜欢让数据库条目包含按键分组的导航选项,并通过参数引用子操作.

所以你的导航表可能看起来像这样

grpId    Title        Path
1        Home Page    /
1        About Page   /Home/About
1        Reports Page /Reports
2        Home Page    /
2        Admin Page   /Admin
2        Reports Page /Reports
Run Code Online (Sandbox Code Playgroud)

而你的孩子的行为会受到影响

[OutputCache(Duration = 60000, VaryByParam = "grpId")]
public PartialViewResult NavigationPage(int grpId)
Run Code Online (Sandbox Code Playgroud)

可以拉出所有导航组选项并渲染自定义导航菜单.这种形式的输出缓存是按时间(60000秒和您的参数)自定义的


结论:

我怀疑我没有告诉你什么新东西,但只确认了你已经倾向于什么.MVC框架非常强大,并提供了很好地处理您想要做的工具.使用文件和数据缓存也是一种有效的方法,但它会让您更加头疼,并且需要您自己实施.

请记住: Haacks的帖子已超过4年(MVC 2 Beta).从那时起,框架和输出缓存已经发展得很好.您现在可以缓存部分,而无需担心缓存整个页面.最近对MVC 4缓存的引用并没有直接反映Phil先前的担忧,但显然忽略了它们.