2009-12-09 9 views
37

Aşağıdaki kaynak dosyalarının en iyi kullanımı nedir?Asp.net MVC Kaynak Dosyaları İçin En İyi Yöntem

  1. Özellikleri -> Kaynaklar
  2. App_GlobalResources klasör
  3. App_LocalResources klasör Ayrıca arasındaki fark nedir bilmek istiyorum

(Phil DataAnnotation içinde yerelleştirme için bu kaynağı kullanılır) (1) ve (2) asp.net mvc uygulamasında.

sayesinde
Soe Moe

cevap

32

App_GlobalResources ve App_LocalResources'dan kaçınmalısınız. Craig'in belirttiği gibi, bunlara ASP.NET çalışma zamanının dışında erişemediğiniz için App_GlobalResources/App_LocalResources ile ilgili sorunlar vardır. Bunun sorunlu olacağına dair iyi bir örnek, uygulamanızı test ettiğinizde birim olduğudur.

K. Scott Allen bir süre önce bunun hakkında blog yazdı. ASP.NET MVC here'da App_GlobalResources ile sorunu açıklamak için iyi bir iş yapar.

+0

Heh. Sadece aynısını göndermek istedim. ÇALIŞIYOR bir cazibe gibi. :) –

7

Özellikleri -> Kaynaklar görüşleriniz dışında görülebilir ve güçlü türleri aşağıda uygulamayı derlemek zaman oluşturulur.

App_ *, görünümleriniz derlendiğinde, ASP.NET tarafından derlenir. Sadece görüşte mevcutlar. Global ve yerel için this page adresine bakın.

12

önerilen (yani K. Scott Allen'in blog gibi) solüsyonu (1) ile giderseniz: açık yerelleştirme ifadeleri (aka bildirim kaynak bağlayıcı ifadeler), örneğin kullanmaya çalışıyor olanlar için

<%$ 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); 
    } 
} 

Ardından, web.config için bu ekleyin:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en" 
        resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" /> 
+0

Büyük teşekkürler! Tam ihtiyacım olan şey. –

+0

Bu ilginç! – Michael

+0

'Resources.ResourceInAppToGetAssembly' nedir? Derleme yapmıyor ve herhangi bir referans bulamıyorum ama bu örnekte? Kullandığınız gerçek kaynak sınıfı için bir takma ad mı? – ProfK