2016-09-20 11 views
0

ユーザーの言語設定に基づいてフィールド名を変換するカスタム表示名属性があります。残念なことに、その後のユーザーの言語設定に関係なく、後続のすべての要求に対して最初のユーザーの言語設定がキャッシュされます。その結果、ページの内容、ヘッダー、およびメニュー項目が適切な言語で表示されますが、ラベルの付いたフィールドだけが間違った言語で表示されます。私が使用している。ここMVCのカスタム表示名属性に対するキャッシュを防止する

はビューモデルの一部である:ここで

public class RegisterViewModel 
{ 
    [CustomEmailAddress] 
    [CustomDisplayName("lbl_email")] 
    public string Email { get; set; }  
    [CustomRequired] 
    [CustomDisplayName("lbl_fn")] 
    [StringLength(255)] 
    public string FirstName { get; set; }  
    ... 
} 

カスタム表示名属性です:

public class CustomDisplayNameAttribute : DisplayNameAttribute 
    { 
     public CustomDisplayNameAttribute(string value = "") 
      : base(GetMessageFromResource(value)) 
     { 
     } 

     private static string GetMessageFromResource(string value) 
     { 
      string CurrentUser; 
      try 
      { 
       CurrentUser = HttpContext.Current.User.Identity.Name; 
      } 
      catch 
      { 
       CurrentUser = ""; 
      } 
      string lang = ModelInit.repo.LangCode(CurrentUser); 
      string ItemLegend = ModelInit.repo.TranslateItem(value, lang); 
      return ItemLegend; 
     } 
    } 

問題をデバッグしている間、私はMVCは気にしませんことがわかりましたユーザーがログオフして新しいユーザーがログオンした後でも、後続の要求で "CustomDisplayNameAttribute"クラスにヒットします。そこでカスタムディスプレイ属性を次のように修飾してみました:

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] 

でも動作しませんでした。この動作を変更できない場合(フレームワークに組み込まれているため)、ユーザーがログオフしたときにカスタム表示名属性からキャッシュをクリアする方法はありますか? (実際には、これが私の好みの解決策になります!)今は、プログラムを停止して再起動するだけです。

答えて

0

短い答え:いいえ

OutputCacheAttributeは全体のコントローラメソッドの出力をキャッシュするために使用されるが、モデル属性のキャッシングとは何の関係もありません。属性は単に静的なメタデータであるため、MVCはそれを取得するためにリフレクションを使用する必要があり、この比較的低速な操作の効果は結果をキャッシュすることによって最小限に抑えられます。

残念ながら、このキャッシュをクリアする方法はありません。マルチスレッドで安全な方法で実行すると、パフォーマンスが低下するロックが必要になるためです。 モデルメタデータ、位置、および(オプション)コントローラ出力含むMVC全体にわたって使用されている複数のキャッシュが存在すること

注。それぞれは、MVCの上にマルチテナントを作成しようとしたときに発見した別の実装とキャッシュキー戦略を使用しています。 MVC 6では少し改善されました(簡単に)。

関連する問題