37

次のリソース ファイルの最適な使用法は何ですか。

  1. プロパティ → リソース ( Philは DataAnnotation でのローカライズにこのリソースを使用しました)
  2. App_GlobalResources フォルダー
  3. App_LocalResources フォルダー

asp.net mvc アプリケーションの (1) と (2) の違いも知りたいです。

4

3 に答える 3

32

とを避ける必要がApp_GlobalResourcesありApp_LocalResourcesます。Craigが述べたように、ASP.NETランタイムの外部ではアクセスできないため、 App_GlobalResources/に問題があります。App_LocalResourcesこれがどのように問題になるかを示す良い例は、アプリを単体テストする場合です。

K.スコットアレンは少し前にこれについてブログを書きました。彼はここApp_GlobalResourcesでASP.NETMVCの問題をうまく説明しています。

于 2009-12-09T18:48:46.103 に答える
12

推奨される解決策 (1) を使用する場合 (つまり、K. Scott Allen のブログのように):

明示的なローカライゼーション式 (別名、宣言型リソース バインディング式) を使用しようとしている場合は、次のようになります。<%$ Resources, MyResource:SomeString %>

public class AppResourceProvider : IResourceProvider
{
    private readonly string _ResourceClassName;
    ResourceManager _ResourceManager = null;

    public AppResourceProvider(string className)
    {
        _ResourceClassName = className;
    }

    public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
    {
        EnsureResourceManager();
        if (culture == null)
        {
            culture = CultureInfo.CurrentUICulture;
        }
        return _ResourceManager.GetObject(resourceKey, culture);
    }

    public System.Resources.IResourceReader ResourceReader
    {
        get
        {
            // Not needed for global resources
            throw new NotSupportedException();
        }
    }

    private void EnsureResourceManager()
    {
        var assembly = typeof(Resources.ResourceInAppToGetAssembly).Assembly;
        String resourceFullName = String.Format("{0}.Resources.{1}", assembly.GetName().Name, _ResourceClassName);
        _ResourceManager = new global::System.Resources.ResourceManager(resourceFullName, assembly);
        _ResourceManager.IgnoreCase = true;
    }
}

public class AppResourceProviderFactory : ResourceProviderFactory
{
    // Thank you, .NET, for providing no way to override global resource providing w/o also overriding local resource providing
    private static Type ResXProviderType = typeof(ResourceProviderFactory).Assembly.GetType("System.Web.Compilation.ResXResourceProviderFactory");
    ResourceProviderFactory _DefaultFactory;

    public AppResourceProviderFactory()
    {
        _DefaultFactory = (ResourceProviderFactory)Activator.CreateInstance(ResXProviderType);
    }

    public override IResourceProvider CreateGlobalResourceProvider(string classKey)
    {
        return new AppResourceProvider(classKey);
    }

    public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
    {
        return _DefaultFactory.CreateLocalResourceProvider(virtualPath);
    }
}

次に、これを web.config に追加します。

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
                   resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
于 2011-10-09T00:10:21.030 に答える
7

プロパティ → リソースはビューの外に表示され、アプリケーションをコンパイルすると強力な型が生成されます。

ビューがコンパイルされると、App_* は ASP.NET によってコンパイルされます。ビューでのみ使用できます。グローバルとローカルについては、このページを参照してください。

于 2009-12-09T17:17:38.407 に答える