以下資源文件的最佳用法是什麼?Asp.net MVC資源文件的最佳實踐
- 屬性 - >資源(Phil使用該資源在DataAnnotation本地化)
- App_GlobalResources文件夾
- App_LocalResources文件夾
我也想知道是什麼區別(1)和(2)在asp.net mvc應用程序中。
感謝,
梭萌
以下資源文件的最佳用法是什麼?Asp.net MVC資源文件的最佳實踐
我也想知道是什麼區別(1)和(2)在asp.net mvc應用程序中。
感謝,
梭萌
您應該避免App_GlobalResources
和App_LocalResources
。 與Craig提到的一樣,App_GlobalResources
/App_LocalResources
存在問題,因爲您無法在ASP.NET運行時之外訪問它們。這是一個很好的例子,當你單元測試你的應用程序。
K. Scott Allen前段時間在博客上寫了一些內容。他在ASP.NET MVC here中用App_GlobalResources
解釋了問題。
屬性 - >資源可以看到你的觀點之外,強大的類型,當您編譯應用程序生成。
當你的視圖被編譯時,App_ *被ASP.NET編譯。他們只在視圖中可用。查看全球與當地的this page。
如果你用推薦的解決方案(1)(即在K.斯科特·艾倫的博客)去:
對於那些試圖使用顯式本地化表達式(又名聲明資源綁定表達式),例如<%$ 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" />
嘿。只是想發佈完全相同。奇蹟般有效。 :) – 2010-01-15 14:39:19