Лучшая практика для файлов ресурсов MVC Asp.net

Каковы наилучшие возможности использования следующих файлов ресурсов.

  • Свойства → Ресурсы (Phil использовали этот ресурс для локализации в DataAnnotation)
  • папка App_GlobalResources
  • папка App_LocalResources

Я также хотел бы знать, в чем разница между (1) и (2) в приложении asp.net mvc.

Спасибо,
Soe Moe

Ответ 1

Вам следует избегать App_GlobalResources и App_LocalResources. Как упоминал Крейг, есть проблемы с App_GlobalResources/App_LocalResources, потому что вы не можете получить к ним доступ за пределами среды выполнения ASP.NET. Хорошим примером того, как это будет проблематично, является то, что вы тестируете устройство на своем устройстве.

К. Скотт Аллен писал об этом некоторое время назад. Он неплохо объясняет проблему с App_GlobalResources в ASP.NET MVC здесь.

Ответ 2

Если вы идете с рекомендуемым решением (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" />

Ответ 3

Свойства → Ресурсы можно увидеть за пределами ваших представлений, а сильные типы создаются при компиляции вашего приложения.

App_ * скомпилирован ASP.NET, когда ваши представления компилируются. Они доступны только в представлении. См. эту страницу для глобальных и локальных.