ASP.NET MVC 리소스 파일에 대한 모범 사례
-
18-09-2019 - |
문제
다음 리소스 파일의 최상의 사용법은 무엇입니까?
- 속성 → 자원 (필 이 리소스를 데이터 분석에서 현지화에 사용했습니다)
- app_globalresources 폴더
- app_localresources 폴더
또한 ASP.NET MVC 응용 프로그램에서 (1)과 (2)의 차이점이 무엇인지 알고 싶습니다.
해결책
당신은 피해야합니다 App_GlobalResources
그리고 App_LocalResources
. Craig가 언급했듯이 문제가 있습니다 App_GlobalResources
/App_LocalResources
ASP.NET 런타임 외부에서 액세스 할 수 없기 때문입니다. 이것이 어떻게 문제가되는지에 대한 좋은 예는 앱을 테스트 할 때입니다.
K. Scott Allen은 얼마 전에 이것에 대해 블로그를 작성했습니다. 그는 문제를 설명하는 좋은 일을합니다. App_GlobalResources
ASP.NET MVC에서 여기.
다른 팁
권장 솔루션 (1) (예 : K. Scott Allen의 블로그에서와 같이)와 함께 가면 :
명시 적 현지화 표현식 (일명 선언 자원 바인딩 표현)을 사용하려는 사람들을 위해 <%$ 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" />
속성 → 리소스는 귀하의보기 외부에서 볼 수 있으며 응용 프로그램을 컴파일 할 때 강력한 유형이 생성됩니다.
APP_*는 뷰가 컴파일 될 때 ASP.NET에 의해 컴파일됩니다. 그들은보기에서만 사용할 수 있습니다. 보다 이 페이지 글로벌 대 현지.
제휴하지 않습니다 StackOverflow