2

Translatorオブジェクト(カスタムクラス)を使用してWebサイトのテキストを公開しています(オブジェクトはデータベースからのテキストを格納します)。Translatorオブジェクトは、キャッシュのApplication_Start()関数に格納されます。

Translatorオブジェクトの現在の使用法は次のとおりです。

  • 私はMasterViewModelを持っています

    public class MasterViewModel
    {
        public Translator Translator = HttpContext.Current.Cache.Get("Translator") as   Translator;
    }
    
  • すべてのビューには、MasterViewModelに固有のビューモデルがあります

    public class RandomViewModel : MasterViewModel
    {
    }
    
  • 私の見解では、Translatorオブジェクトを使用できます

    @model ViewModels.RandomViewModel
    
    @Model.Translator.GetText(label)
    

これは良いアプローチではないと思います。App_Codeでかみそりヘルパーを作成して、私の見解で使用できるようにすることをお勧めしますか?

    @Translate.GetText("RANDOM_TEXT")

これはヘルパー関数になります(Translate.cshtml内)

    @helper GetText(string label)
    {
        Translator Translator = @Cache.Get("Translator") as Translator;
        @: Translator.GetTextByLabel(label);
    }

したがって、私の質問は、キャッシュされたオブジェクトをすべてのビューに公開するための最良の方法は何ですか。上記のアプローチの1つは良いですか?または、別の解決策を使用する必要がありますか?

(私の英語が大丈夫だといいのですが、私はオランダ語です)

4

1 に答える 1

2

WebViewPageこれを実現する方法はいくつかありますが、このクラスから継承するすべてのレイザービューを派生させて強制することにより、基本クラスを作成します。

public abstract class MyWebViewPageBase<T>: WebViewPage<T>
{
   private Translator _translator;

   protected override void InitializePage()
   { 
     _translator = Context.Cache.Get("Translator") as Translator;
   }

   public string Translate(string label)
   {
     if(_translator != null)
       return _translator.GetText(label);

     return "";
   }
}

今、私はMyWebViewPageいくつかの方法でかみそりのビューを継承することができます:

最初のアプローチは、すべてのビューから@inheritsディレクティブを使用することです。

元。

// Index.cshtml
@inherits MyWebViewPageBase
@model ...

....

Viewsもう1つのアプローチは、すべてのビューのベースページをグローバルに設定する方法であり、そのためには、フォルダーに存在するweb.configを変更する必要があります。

pageBaseTypeofpages要素を以下のように設定する必要があります。

<pages pageBaseType="MyWebViewPageBase">

これで、どのビューからでも、以下のようにtranslateメソッドを呼び出すことができます。

@Translate("RANDOM_TEXT")

お役に立てれば!

于 2012-06-08T10:23:04.863 に答える