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

37

以下是以下资源文件的最佳用法。

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

我还想知道在asp.net mvc应用程序中,(1)和(2)之间的区别是什么。

3个回答

32

您应避免使用 App_GlobalResourcesApp_LocalResources

就像Craig所提到的那样,App_GlobalResources/App_LocalResources存在问题,因为您无法在ASP.NET运行时之外访问它们。这会在应用程序单元测试时造成问题,是一个很好的例子。

K. Scott Allen之前在博客中谈到过这个问题。他非常好地解释了在ASP.NET MVC中使用 App_GlobalResources 会出现什么问题,您可以在这里找到相关信息。


12

如果您采用推荐的方案(即K. Scott Allen博客中的方案1):

对于那些尝试使用显式本地化表达式(也称声明性资源绑定表达式)的人,例如<%$ 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" />

Resources.ResourceInAppToGetAssembly是什么?它无法编译,我找不到任何关于它的参考,除了这个例子之外?它是您正在使用的实际资源类的代名词吗? - ProfK

7

属性→资源可以在视图之外看到,并且在编译应用程序时生成强类型。

App_*是由ASP.NET在编译视图时编译的。它们仅在视图中可用。请参见此页面了解全局与本地的区别:链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接