JavaScript对象的资源文件

分享于 

8分钟阅读

Web开发

  繁體 雙語

介绍

这是一个可以拖动到网页或者用户控件的ASP.NET 控件。 它向页面注册一个 JavaScript,它包含一个对象,表示文件的内容( 键和值) resx ( 资源)。 这对于从JavaScript代码( 客户端) 获取资源字符串很有用。

Background

众所周知,在客户端JavaScript中获取资源字符串是不直接的。 这里控件使共享客户端代码中的相同服务器端资源文件( resx文件) 变得容易。

使用代码

web控件将把 resx 文件中的所有条目写入到一个JavaScript对象。 因此请确保 resx文件条目不包含敏感数据,resx文件中条目的数量不是太大。

代码包含两个类,ResourcesToJavaScriptBaseGlobalResourcesToJavaScriptResourcesToJavaScriptBase 作为一个 abstract 基类,它包含了思想的逻辑。 GlobalResourcesToJavaScript 是一个具体类,它专门处理处理全局资源( 在 App_GlobalResources 文件夹中)的逻辑。

注释:如果资源键包含点(。),它将被下划线( _ ) 替代。 示例:textBox1.Text 将在JavaScript对象中转换为 textBox1_Text

ResourcesToJavaScriptBase
///<summary>/// Represents a class that can be used to render/// a JavaScript object that contains resource keys and values/// of a specific resX file dependant on the CurrentUI culture.///</summary>publicabstractclass ResourcesToJavaScriptBase : Control
{
 ///<summary>/// Gets the full resX file path.///</summary>///<returns></returns>protectedabstractstring GetResXFilePath();
 ///<summary>/// Sets and Gets the generated JavaScript object name.///</summary>publicabstractstring JavaScriptObjectName
 {
 get;
 set;
 }
 ///<summary>/// Get the resource value of specific key///</summary>///<paramname="key"></param>///<returns></returns>protectedabstractstring GetResourceValue(string key);
 protectedvirtualvoid ValidateBeforeRender(System.Web.UI.HtmlTextWriter writer)
 {
 if (!File.Exists(GetResXFilePath()))
 {
 writer.Write("GlobalResourcesToJavaScript:" + this.ClientID + 
 ": Can't find the file" + GetResXFilePath());
 return;
 }
 return;
 }
 protectedoverridevoid OnLoad(EventArgs e)
 {
 if (!string.IsNullOrEmpty(JavaScriptObjectName) && 
 File.Exists(GetResXFilePath()) && 
!Page.ClientScript.IsClientScriptBlockRegistered(
 GetType(), JavaScriptObjectName))
 {
 StringBuilder script = new StringBuilder();
 script.Append("<script type="text/javascript">");
 using (System.Resources.ResXResourceReader resourceReader = 
 new System.Resources.ResXResourceReader(GetResXFilePath()))
 {
 script.Append(" var" + JavaScriptObjectName + " = {");
 bool first = true;
 foreach (DictionaryEntry entry in resourceReader)
 {
 if (first)
 first = false;
 else script.Append(",");
 script.Append(NormalizeVariableName(entry.Key asstring));
 script.Append(":");
 script.Append("'" + GetResourceValue(entry.Key asstring) + "'");
 }
 script.Append(" }; </script>");
 Page.ClientScript.RegisterClientScriptBlock(GetType(), 
 JavaScriptObjectName, script.ToString(), false); 
 }
 }
 base.OnLoad(e);
 }
 protectedoverridevoid Render(HtmlTextWriter writer)
 {
 ValidateBeforeRender(writer);
 base.Render(writer);
 }
 ///<summary>/// Normalizes the variable names to be used as JavaScript variable names///</summary>///<paramname="key"></param>///<returns></returns>protectedstaticstring NormalizeVariableName(string key)
 {
 return key.Replace('.', '_');
 }
}
GlobalResourcesToJavaScript
///<summary>/// Represents a class that can be used to render/// a JavaScript object that contains resource keys and values/// of a specific global resX file dependant on the CurrentUI culture.///</summary>publicclass GlobalResourcesToJavaScript : ResourcesToJavaScriptBase
{
 ///<summary>/// The name of the Global ResX file (ex:"Resource1"/// if the ResX file is"Resource1.resx")///</summary>publicstring GlobalResXFileName
 {
 get;
 set;
 }
 privatestring _javaScriptObjectName;
 ///<summary>/// Sets and Gets the generated JavaScript object name./// if not set it will return the normalized GlobalResXFileName.///</summary>publicoverridestring JavaScriptObjectName
 {
 set {
 _javaScriptObjectName = value;
 }
 get {
 if (!string.IsNullOrEmpty(_javaScriptObjectName) && 
 _javaScriptObjectName.Trim()!= string.Empty)
 {
 return NormalizeVariableName(_javaScriptObjectName);
 }
 return NormalizeVariableName(GlobalResXFileName);
 }
 }
 protectedoverridestring GetResourceValue(string key)
 {
 stringvalue = HttpContext.GetGlobalResourceObject
 (GlobalResXFileName, key) asstring;
 returnvalue == null? string.Empty : value;
 }
 protectedoverridestring GetResXFilePath()
 {
 return Page.MapPath(Path.Combine("~//App_GlobalResources", 
 GlobalResXFileName + ".resx"));
 }
 protectedoverridevoid ValidateBeforeRender(System.Web.UI.HtmlTextWriter writer)
 {
 if (string.IsNullOrEmpty(GlobalResXFileName) || 
 GlobalResXFileName.Trim() == string.Empty)
 {
 writer.Write("GlobalResourcesToJavaScript:" + 
 this.ClientID + ": Please specify GlobalResXFileName");
 return;
 }
 base.ValidateBeforeRender(writer);
 }
}

我们需要做的就是向网页或者用户控件添加一个 GlobalResourcesToJavaScript 实例,并将属性 GlobalResXFileName 设置为所需的文件 resx 文件的文件名。

我们还可以将属性 JavaScriptObjectName 设置为需要调用生成的JavaScript对象的NAME:

<ResourcesToJavaScript:GlobalResourcesToJavaScriptID="GlobalResourceToJavaScript1"runat="server"GlobalResXFileName="Resource1"JavaScriptObjectName="Resources"></ResourcesToJavaScript:GlobalResourcesToJavaScript>

生成的JavaScript将类似于:

<scripttype="text/javascript"> 
 var Resources = { Entry1:'Entry 1 text', Entry2:'Entry 2 text', 
 Entry3:'Entry 3 text' };</script>

这可以很容易地从任何JavaScript代码中使用,如:

alert(Resources.Entry2);

历史记录

  • 19th 2011年02月: 初始帖子
  • 20th 2011年02月: 文章已经更新

相关文章