Frage

Was ist die beste Nutzung der folgenden Ressourcendateien.

  1. Eigenschaften → Ressourcen ( Phil benutzten Ressourcen für die Lokalisierung in DataAnnotation)
  2. App_GlobalResources Ordner
  3. App_LocalResources Ordner

Ich würde auch gerne wissen, was ist der Unterschied zwischen (1) und (2) in asp.net MVC-Anwendung.

War es hilfreich?

Lösung

Sie sollten App_GlobalResources und App_LocalResources vermeiden. Wie Craig erwähnt, gibt es Probleme mit App_GlobalResources / App_LocalResources, weil man sie nicht außerhalb der ASP.NET-Laufzeit zugreifen können. Ein gutes Beispiel dafür, wie dies wäre problematisch ist, wenn Sie Unit-Tests Ihre Anwendung sind.

K. Scott Allen gebloggt dies vor einer Weile. Er macht einen guten Job zu erklären, das Problem mit App_GlobalResources in ASP.NET MVC hier .

Andere Tipps

Wenn Sie mit der empfohlenen Lösung gehen (1) (das heißt, wie in K. Scott Alle Blog):

Für diejenigen unter Ihnen versuchen explizite Lokalisierung Ausdrücke zu verwenden (auch bekannt als deklarative Ressource Bindungsausdrücke), z.B. <%$ 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);
    }
}

Dann fügen Sie diese zu Ihrer web.config:

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

Eigenschaften → Ressourcen außerhalb Ihrer Ansichten und starke Typen erzeugt werden sehen, wenn Sie die Anwendung kompilieren.

app_ * wird von ASP.NET kompiliert, wenn Sie Ihre Ansichten zusammengestellt. Sie sind nur in der Ansicht verfügbar. Siehe Diese Seite für globale vs. lokal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top