Best practice for ASP.NET MVC resource files

后端 未结 3 1602
时光说笑
时光说笑 2020-11-30 01:31

What are the best usage of the following resource files.

  1. Properties → Resources (Phil used this resource for localization in DataAnnotation)
  2. App_Glo
相关标签:
3条回答
  • 2020-11-30 01:43

    If you go with the recommended solution (1) (i.e. as in K. Scott Allen's blog):

    For those of you trying to use explicit localization expressions (aka declarative resource binding expressions), e.g. <%$ 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);
        }
    }
    

    Then, add this to your web.config:

        <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
                       resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
    
    0 讨论(0)
  • 2020-11-30 01:44

    You should avoid App_GlobalResources and App_LocalResources. Like Craig mentioned, there are problems with App_GlobalResources/App_LocalResources because you can't access them outside of the ASP.NET runtime. A good example of how this would be problematic is when you're unit testing your app.

    K. Scott Allen blogged about this a while ago. He does a good job of explaining the problem with App_GlobalResources in ASP.NET MVC here.

    0 讨论(0)
  • 2020-11-30 01:58

    Properties → Resources can be seen outside of your views and strong types are generated when you compile your application.

    App_* is compiled by ASP.NET, when your views are compiled. They're only available in the view. See this page for global vs. local.

    0 讨论(0)
提交回复
热议问题