2

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

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

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

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

什么是 MVC 进行脚本全球化的方式,MsAjax 的 __cultureInfo 被定制为浏览器的首选语言?

4

2 回答 2

5

好吧……好吧……原来你必须自己做。

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

特征:-

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

享受!

//
// 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 ());
    } 
  }
}
于 2009-05-05T17:11:05.233 回答
1

我们已经在 CDN 上发布了更新的全球化脚本。这篇博文将引导您了解如何通过ASP.NET MVC 客户端验证来利用全球化。

于 2010-05-10T20:06:59.627 回答