ユーザーの言語設定に基づいてフィールド名を変換するカスタム表示名属性があります。残念なことに、その後のユーザーの言語設定に関係なく、後続のすべての要求に対して最初のユーザーの言語設定がキャッシュされます。その結果、ページの内容、ヘッダー、およびメニュー項目が適切な言語で表示されますが、ラベルの付いたフィールドだけが間違った言語で表示されます。私が使用している。ここ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)]
でも動作しませんでした。この動作を変更できない場合(フレームワークに組み込まれているため)、ユーザーがログオフしたときにカスタム表示名属性からキャッシュをクリアする方法はありますか? (実際には、これが私の好みの解決策になります!)今は、プログラムを停止して再起動するだけです。