2

アプリケーション用に適切にフォーマットされた HTML メニューを生成する一般的な "menu.ascx" ユーザー コントロールを Asp.Net MVC に記述しようとしています。メニューは、データベース内のコンテンツと一連のリソース解決に基づいて生成されます...これらは、ViewModel の属性を介して PartialView に渡されます。

データベースとリソース ファイルへの往復回数を制限するために、menu.ascx コントロールで OutputCache ディレクティブを使用することは理にかなっています。私の意図は、VaryByParam=none および VaryByCustom 属性で OutputCache ディレクティブをマークし、global.asax でカスタム セキュリティ ルックアップを実装することです...

私の質問は、コントローラーで ViewModel を構築するときにデータ フェッチ操作をスキップできるように、menu.ascx の OutputCache がいつ使用されるかをどのように知ることができるかということです。


UserControl コードのサンプル:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl"  %>
<%@ OutputCache VaryByParam="none" VaryByCustom="customstring" %>
<ul>
<% var model = (IMyViewModel)Model; 
 foreach (var menu in model.Menus) { %>
   <li><a href="<%= menu.href %>"><%= menu.Text %></a></li>
<% } %>
</ul>
4

2 に答える 2

1

ASP.NETMVCでのドーナツホールキャッシングとASP.NETMVC結果キャッシュに関する興味深い記事があります。基本的にマスターページでRenderActionメソッドを使用してこのメ​​ニューを実行し、データベースとthebからデータをプルしてキャッシュするアクションを呼び出します。アクションの結果

于 2009-07-09T20:35:41.883 に答える
0

私は自分の問題に対する適切な回避策を見つけたと思います。

具体的なViewModel実装のMenusプロパティゲッターで、インスタンス化するコントローラーに戻ってMenuデータを要求するプロキシコードを記述しています。このようにして、PartialViewが要求したときに、メニューデータをオンザフライで作成できます。PartialViewがOutputCacheから出てくる場合、Menuプロパティは要求されません。

したがって、私のIMyViewModelは次のようになります。

public interface IMyViewModel {

  IEnumerable<Menu> Menus { get; }

  ///<summary>
  /// A pointer back to the calling controller, which inherits from the abstract MyBaseController
  ///</summary>
  MyBaseController Controller { get; set; }

}

メニューの具体的な実装は次のようになります。

public IEnumerable<Menu> Menus 
{
   get { return Controller.GetMenus(); }
}

コメント?これは実行可能な解決策ですか?

于 2009-07-10T11:46:31.950 に答える