ASP.NET MVC资源文件的最佳实践

Soe*_*Moe 37 asp.net-mvc localization resx asp.net-mvc-2

以下资源文件的最佳用法是什么?

  1. 属性→资源(Phil使用此资源在DataAnnotation中进行本地化)
  2. App_GlobalResources文件夹
  3. App_LocalResources文件夹

我也想知道asp.net mvc应用程序中(1)和(2)之间的区别.

Rya*_*est 32

你应该避免App_GlobalResourcesApp_LocalResources.就像Craig提到的那样,App_GlobalResources/ 有些问题/ App_LocalResources因为你无法在ASP.NET运行时之外访问它们.当您对应用程序进行单元测试时,一个很好的例子就是如何解决这个问题.

K. Scott Allen不久前在博客上发表过这篇文章.他App_GlobalResources这里用ASP.NET MVC 很好地解释了这个问题.


mar*_*arq 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,将其添加到您的web.config:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
                   resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Run Code Online (Sandbox Code Playgroud)


Cra*_*ntz 7

属性→可以在视图之外查看资源,编译应用程序时会生成强类型.

编译视图时,ASP.NET会编译App_*.它们仅在视图中可用.请参阅此页面了解全局与本地.