5

私は独自のサーバー側コントロールを作成しており、.resxファイルに保存されている画像を使用しています。コンソール アプリケーションでは、このコードは正常に動作します。

     ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
        
     foreach (DictionaryEntry d in rsxr)
     {
        Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
     }

     rsxr.Close();

しかし、ここで

      protected override void RenderContents(HtmlTextWriter output)
    {
        ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
  
        base.RenderContents(output);

        foreach (DictionaryEntry d in rsxr)
        {
            output.Write(d.Key.ToString());
        }
        
    }

次のエラーが表示されます。

ファイル 'C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\Resource1.resx' が見つかりませんでした

.resourceResourceManager を使用しようとしましたが、ファイルが必要です。ツールにアクセスできずresgen(コマンド プロンプトがコマンドを認識しませんresgen)、インストールできません (試行中にいくつかのエラーが発生しました)。

私の質問は次のとおりです。

  1. なぜ読めないの.resxですか?

  2. resgenツールを正しくインストールするには?

ありがとう。

4

2 に答える 2

1

あなたの説明から、ユーザー コントロールのリソース ファイルを見つけてアクセスする必要があることがわかりました。次の方法でうまく機能することがわかりました。

  1. プロジェクト レベルでApp_GlobalResourcesを作成します (コンテキスト メニュー経由Add -> Add ASP.NET Folder -> App_GlobalResources) 。

  2. コントロールと同じ名前のリソース ファイルをApp_GlobalResources内に作成します。たとえば、コントロールmyControl.ascxの名前が の場合、デフォルト言語のリソース ファイルの名前は次のようにする必要があります。myControl.ascx.resx

  3. 必要な言語ごとに追加のリソース ファイルを作成します。たとえば、ドイツ語 (" de-DE") が必要な場合は、myControl.ascx.de.resx を追加します。

  4. 次のようにクラスを追加MultiLanguageUserControlします。

    public class MultiLanguageUserControl : System.Web.UI.UserControl
    {
        public string getResValue(string id)
        {
            var ctrlPath = TemplateControl.AppRelativeVirtualPath;
            var ctrlFile = System.IO.Path.GetFileName(ctrlPath);
            var resObj = GetGlobalResourceObject(ctrlFile, id);
            if (resObj!=null)
                        return resObj.ToString();
            else
                        return string.Format("UNRESOLVED[{0}]", id);        
        }
    }
    
  5. myControl のコード ビハインドを開き、 fromMultiLanguageUserControlではなく from から継承するようにしSystem.Web.UI.UserControlます。

    public partial class myControl : MultiLanguageUserControl { //... }

  6. <%=getResValue("resid")%>HTML コードでは、次のような新しい関数を使用します"resid"。 は、検索するリソース文字列の名前です。要件に応じて、<%:の代わりにHTML エンコード タグを使用することもできます。<%=または、getResValueユーザー コントロールのサーバー側 C# コードの任意の場所を使用して、リソース ファイルから値を取得することもできます。

  7. Page_Loadユーザーコントロールを使用するページのイベントで言語検出をサポートしていることを確認してください。これを行う方法については、こちらで説明しています(関数を探してくださいInitializeCulture)。

注:ユーザー コントロール内からページのローカル リソース文字列を読み取りたい場合は、こちらを参照してください

于 2013-03-11T13:13:47.560 に答える