ajax - ASP.NET MVC 中 MicrosoftAjax.js 的脚本全局化怎么样?

标签 ajax asp.net-mvc scripting globalization

创建一个 MVC 项目,其“Scripts”文件夹将包含 MicrosoftAjax.js(发布和调试版本)。

至少在 Visual Web Developer 2008 Express Edition 中,Scripts 文件夹不包含任何全局化脚本,即为该文化定义和设置“__cultureInfo”的 205 个文件(例如“af-ZA.js”) .

MVC 项目模板 Zip 文件中也缺少它们。

我猜你可以单独下载它们,但是......

通过 MsAjax 的 __cultureInfo 为浏览器的首选语言量身定制的 MVC 脚本全局化方式是什么?

最佳答案

好吧...好吧...事实证明你必须自己做。

以下代码告诉您如何获取全局化脚本并安装它们。此外,它还为您提供了一种方便的扩展方法,允许您在 View 或母版页上注入(inject)对 MS AJAX 的引用,无论是否启用脚本全局化。

特点:-

  • 以最小的努力将 MS AJAX 注入(inject) View
  • 根据程序集是否可用选择调试或发布版本 在 Debug 或 Release 模式下编译
  • 可选择启用脚本全局化
  • 可选择注入(inject)对 Sys.Application.initialize() 函数的调用
  • 可选地内联代码以启用脚本全局化,例如 ScriptManager 做(需要条件编译符号);默认情况下,会注入(inject)对全局化脚本文件的引用

尽情享受吧!

//
// Include Microsoft Ajax In Your ASP.NET MVC Projects, Optionally With Script Globalization Enabled
// -------------------------------------------------------------------------------------------------
//
// Written by Andrew Webb, 4th May 2009.
//
// Feel free to use in your ASP.NET MVC projects.
// Written for ASP.NET MVC 1.0 and .NET Framework 3.5 SP1.
//
// With thanks to Bertrand LeRoy and Steven Sanderson.
// http://weblogs.asp.net/bleroy/
// http://blog.codeville.net/
//
// Example usage of 'IncludeMicrosoftAjax':-
//    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" Culture="auto" UICulture="auto" %>
//    <%@ Import Namespace="AspNetMvcHelper" %>
//    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
//    <html xmlns="http://www.w3.org/1999/xhtml" >
//    <head runat="server">
//      <!-- Include Ms Ajax, with script globalization enabled -->
//      <%= Html.IncludeMicrosoftAjax (true, false) %>
//      <!-- other script references here, e.g. jQuery -->
//    </head>
//    etc.
//
// Note: for script globalization, the method in this file gets the current thread's current culture.
// The Culture="auto" setting in the Page directive (above) causes this to be set to the browser's
// preferred language.  Alternatively you can set the current thread's current culture manually.
//
// NOTA BENE: for script globalization, the 205 globalization scripts from the MS AJAX Library must be
// obtained from Microsoft and added to your ASP.NET MVC project, as follows:
// 1) Download the Microsoft AJAX Library 3.5 from:
//    http://www.asp.net/ajax/downloads/
//
// 2) Extract all files from the Zip, and locate the "Globalization" folder.  It should have 205 script files
// in it, from "af-ZA.js" to "zu-ZA.js".  Copy this folder inside your website/project, under the "Scripts"
// folder.  Rename the folder to "MsAjaxGlobalization".  The resulting structure should be:
//   <project>\
//     Scripts\
//       MsAjaxGlobalization\
//         <205 files>
//       <jQuery, Ms Ajax and Ms Mvc Ajax files>
//
// Be sure to include the "MsAjaxGlobalization" folder in your web project.  The easiest way is to click
// "Show All Files" button in the Solution Explorer's toolbar so that all files are shown, then right-click
// on "MsAjaxGlobalization" folder and select 'Include In Project' menu item.  You can now unshow all files
// again.
//

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Text;
using System.IO;
using System.Threading;
using System.Globalization;
using System.Diagnostics.CodeAnalysis;

namespace AspNetMvcHelper
{
  public static class ViewHelpers
  {
    /// <summary>
    /// Includes Microsoft Ajax in a View, optionally with script globalization enabled.
    /// </summary>
    /// <param name="helper">
    /// Unused.  Included because this method is an extension method of System.Web.Mvc.HtmlHelper.
    /// </param>
    /// <param name="enableScriptGlobalization">
    /// true to enable script globalization, else false.  If true, be sure to include the 205 globalization
    /// scripts in your project, in a subfolder called "MsAjaxGlobalization".  This must be a direct sub-
    /// folder of the "Scripts" folder, which in turn must live under the project root (which is the default
    /// for MVC projects).
    /// </param>
    /// <param name="initializeSysApplication">
    /// true to insert a call to 'Sys.Application.initialize', else false.  (Note sure if this should be
    /// done or not for MVC, so it's an option.)
    /// </param>
    /// <returns>
    /// Include-text that contains "script" tags that a) set up variable '_cultureInfo' (optional), b)
    /// cause the browser to load the Microsoft Ajax library (debug or release), and c) call function
    /// 'Sys.Application.initialize' (optional).
    /// </returns>
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId="helper")]
    public static String IncludeMicrosoftAjax (this HtmlHelper helper, Boolean enableScriptGlobalization,
                                               Boolean initializeSysApplication)
    {
      // Define INLINE_SETCULTUREINFO if you want to include the statement to set __cultureInfo in the HTML,
      // like the ScriptManager does.  Leave it undefined to have a script file reference instead (preferred).

#if INLINE_SETCULTUREINFO
      String setCultureInfoText = null;
#endif
      String globalizationScriptFileName = null;

      // Text length without the inline statement to set __cultureInfo.
      Int32 includeTextLength = 400;


      // If script globalization is enabled, get the statement that sets __cultureInfo, and add the
      // length of this statement to the overal length of the include-text.
      if (enableScriptGlobalization)
      {
        // Get the current thread's current culture.  Note: we could have a param that says whether to
        // use this or the UICulture.
        CultureInfo culture = Thread.CurrentThread.CurrentCulture;

        // Form the name of the globalization script file, "en-US.js".
        globalizationScriptFileName = culture.Name + ".js";

#if INLINE_SETCULTUREINFO
        // Read in the contents of this file.  Note that if this fails, the browser will be left with
        // __cultureInfo set to "en-US" (see file "MicrosoftAjax.debug.js", lines 6432 and 6433).
        try
        {
          setCultureInfoText = String.Empty;
          String path = HttpContext.Current.Server.MapPath ("~/Scripts/MsAjaxGlobalization/" +
                                                            globalizationScriptFileName);
          setCultureInfoText = File.ReadAllText (path);

          includeTextLength += setCultureInfoText.Length;
        }
        catch (System.ArgumentNullException)
        {
        }
        catch (System.ArgumentException)
        {
        }
        catch (System.IO.PathTooLongException)
        {
        }
        catch (System.IO.DirectoryNotFoundException)
        {
        }
        catch (System.IO.FileNotFoundException)
        {
        }
        catch (System.IO.IOException)
        {
        }
        catch (System.UnauthorizedAccessException)
        {
        }
        catch (System.NotSupportedException)
        {
        }
        catch (System.Security.SecurityException)
        {
        }
        catch (System.Web.HttpException)
        {
        }
#endif
      }


      // Create and initialize the StringBuilder in which we'll build up the include-text.
      StringBuilder sb = new StringBuilder (includeTextLength);
      sb.AppendLine ();


      // Get the application absolute path of the MS AJAX file (release or debug).  As you can see,
      // the folder and file names and locations are hardcoded.  Convention... but er, no configuration!
#if DEBUG
      String msAjaxScriptPath = VirtualPathUtility.ToAbsolute ("~/Scripts/MicrosoftAjax.debug.js");
#else
      String msAjaxScriptPath = VirtualPathUtility.ToAbsolute ("~/Scripts/MicrosoftAjax.js");
#endif

      // Add the globalization statement.
      if (enableScriptGlobalization)
      {
#if INLINE_SETCULTUREINFO
        sb.AppendLine ("<script type=\"text/javascript\">");
        sb.AppendLine ("//<![CDATA[");
        sb.AppendLine (setCultureInfoText);
        sb.AppendLine ("//]]>");
        sb.AppendLine ("</script>");
#else
        String path = VirtualPathUtility.ToAbsolute ("~/Scripts/MsAjaxGlobalization/" + globalizationScriptFileName);
        sb.AppendLine ("<script src=\"" + path + "\" type=\"text/javascript\"></script>");
#endif
      }

      // Add the MS AJAX library reference.      
      sb.AppendLine ("<script src=\"" + msAjaxScriptPath + "\" type=\"text/javascript\"></script>");

      // Add the call to initialize Sys.Application.
      if (initializeSysApplication)
      {
        sb.AppendLine ("<script type=\"text/javascript\">");
        sb.AppendLine ("//<![CDATA[");
        sb.AppendLine ("if (typeof (Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');");
        sb.AppendLine ("Sys.Application.initialize();");
        sb.AppendLine ("//]]>");
        sb.AppendLine ("</script>");
      }

      // Return the resulting include-text.      
      return (sb.ToString ());
    } 
  }
}

关于ajax - ASP.NET MVC 中 MicrosoftAjax.js 的脚本全局化怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/817046/

相关文章:

c# - 无法将 json 反序列化为 ASP.Net MVC 中的抽象类

asp.net-mvc - ServiceStack 如何在 MyController<T> 上 Autowiring 自定义 IRepository<T> 属性

ruby-on-rails - 如何从 lib/tasks 中的任务访问我的 Rails 数据库?

linux - 删除文件夹,不管它们是否为空

php - 如何使用 php 获取服务器上存储的所有 session 值

javascript - 有没有办法使用ajax水平对齐动态卡?

php - jQuery AJAX 错误处理

javascript - 解析 JSON json_encoded 数据库结果

c# - 我们如何使用 LINQ 从 asp.net mvc3 中的长字符串中提取短字符串?

javascript - 测试 URL 是否可以从 Web 浏览器访问,即确保未被代理服务器阻止