2009-06-02 11 views
28

¿Cómo se obtendrían cadenas de recursos resx en código javascript almacenado en un archivo .js?Usar cadenas de recursos ASP.NET desde dentro de los archivos javascript

Si su Javascript se encuentra en un bloque de script en el marcado, puede utilizar esta sintaxis:

<%$Resources:Resource, FieldName %> 

y va a analizar el valor de los recursos, ya que en la muestra la página ... Por desgracia, que sólo se ser analizado si el javascript aparece en el cuerpo de la página. En un archivo .js externo al que se hace referencia en una etiqueta de <script>, obviamente, esas etiquetas de servidor nunca se analizan.

No quiero tener que escribir un ScriptService para devolver esos recursos ni nada de eso, ya que no cambian después de que se haya rendido la página, por lo que es inútil tener algo activo.

Una posibilidad podría ser escribir un controlador de ashx y señalar las etiquetas de < >, pero todavía no estoy seguro de cómo leería en los archivos .js y analizar las etiquetas de servidor de ese tipo antes de transmitir el texto al cliente. ¿Existe una línea de código que pueda ejecutar que haga esa tarea de manera similar al analizador ASP.NET?

¿Alguien más tiene alguna otra sugerencia?

Respuesta

19

No hay soporte nativo para esto.

Creé un JavaScriptResourceHandler hace un tiempo que puede servir recursos de Serverside en la página del cliente a través de objetos donde cada propiedad del objeto representa una identificación de recurso de localización y su valor. Puede comprobar esto y descargarlo de esta entrada del blog:

http://www.west-wind.com/Weblog/posts/698097.aspx

He estado usando esta ampliamente en una serie de aplicaciones y funciona bien. La principal ventaja de esto es que puede localizar sus recursos en un solo lugar (Resx o en mi caso un ResourceProvider personalizado usando una base de datos) en lugar de tener que tener múltiples esquemas de localización.

+0

Hmm, un enfoque interesante. Podría funcionar para mí. Los inconvenientes son que tengo que tener un archivo de recursos por separado solo para lo que quiero expulsar o enviar cosas extra sin uso ... y eso ' m dentro de sharepoint, por lo que leer el archivo resx como un archivo y analizarlo puede ser un problema, ya veremos. ¡Gracias por la publicación! – Grank

0

Normalmente paso la cadena de recursos como un parámetro para cualquier función de javascript que estoy llamando, de esa manera puedo seguir usando la sintaxis de expresión en el HTML.

+0

que normalmente sería mi inclinación así, pero en este caso, se trata de un tema de lado cliente hace clic controlador para un RadMenu, lo que conduce a una sentencia switch con 7 casos, todas mostrando diferentes "¿Estás seguro?" strings :( – Grank

2

En pocas palabras, haga que ASP.NET sirva JavaScript en lugar de HTML para una página específica. Más limpio si se hace como un IHttpHandler personalizado, pero en caso de apuro una página lo hará, solo recuerda:

1) Elimina todas las cosas de ASP.NET y haz que parezca un archivo JS.

2) Establezca el tipo de contenido como "texto/javascript" en el código subyacente.

Una vez que tenga una secuencia de comandos como esta configuración, puede crear una copia del lado del cliente de sus recursos a la que otras secuencias de comandos del lado del cliente puedan hacer referencia desde su aplicación.

0

I la aplicación de campo marrón en la que estoy trabajando tenemos una xslt que transforma el archivo resx en un archivo javascript como parte del proceso de compilación. Esto funciona bien ya que esta es una aplicación web. No estoy seguro si la pregunta original es una aplicación web.

4

mientras que "Común" es el nombre del archivo de recursos y Msg1 es el nombre del campo. Esto también funciona para cambios culturales.

  Partial Javascript...: 
      messages: 
      { 
       <%=txtRequiredField.UniqueID %>:{      
        required: "<%=Resources.Common.Msg1 %>", 
        maxlength: "Only 50 character allowed in required field." 
       } 
      } 
+0

¡Gracias! funciona perfecto. 'código de alerta (" <% = Resources.LocalizedText.ErrorMessage%> ");' – Equiman

0

uso de un campo oculto para mantener el valor de cadena de recursos y luego acceder al valor del campo en javascript por ejemplo: "/>

var todayString = $ (" input [name = TodayString] [ type = hidden] ") val();..

32

Aquí está mi solución por ahora estoy seguro de que voy a necesitar para hacerlo más versátil en el futuro ... pero hasta ahora esto es bueno

using System.Collections; 
using System.Linq; 
using System.Resources; 
using System.Web.Mvc; 
using System.Web.Script.Serialization; 

public class ResourcesController : Controller 
{ 
    private static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer(); 

    public ActionResult GetResourcesJavaScript(string resxFileName) 
    { 
     var resourceDictionary = new ResXResourceReader(Server.MapPath("~/App_GlobalResources/" + resxFileName + ".resx")) 
          .Cast<DictionaryEntry>() 
          .ToDictionary(entry => entry.Key.ToString(), entry => entry.Value.ToString()); 
     var json = Serializer.Serialize(resourceDictionary); 
     var javaScript = string.Format("window.Resources = window.Resources || {{}}; window.Resources.{0} = {1};", resxFileName, json); 

     return JavaScript(javaScript); 
    } 

} 

// In the RegisterRoutes method in Global.asax: 
routes.MapRoute("Resources", "resources/{resxFileName}.js", new { controller = "Resources", action = "GetResourcesJavaScript" }); 
.

Así que puedo hacer

<script src="/resources/Foo.js"></script> 

y luego mis guiones pueden hacer referencia, por ejemplo, window.Resources.Foo.Bar y obtener una cadena.

+0

Uso Framework 4, mi aplicación es Web, tengo que agregar una referencia a System.Windows.Forms.dll para resolver el método "ResXResourceReader". No puedo hacer "do" para ingresar a "ResourcesController", el La clase ResourcesController se encuentra en la carpeta App_GlobalResources. Establecí el archivo resx como Build Action: Resource. Puse un breakpoint y nada. –

+0

La clase para serializar a JSON se llama 'JavaScriptSerializer', no' Serializer' y no es estática. – modiX

+0

Estoy tratando de usar esto, pero nunca alcanzo el controlador. Tengo un punto de quiebre en la acción, pero nunca llega allí. Además _ _ ¿esto se va a agregar en el archivo _layout.chtml? – mohsinali1317

0

Si usted tiene sus recursos en un ensamblado independiente puede utilizar el ResourceSet en lugar del nombre de archivo. Sobre la base de @Domenics gran respuesta:

public class ResourcesController : Controller 
{ 
    private static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer(); 

    public ActionResult GetResourcesJavaScript() 
    { 
     // This avoids the file path dependency. 
     ResourceSet resourceSet = MyResource.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true); 

     // Create dictionary. 
     var resourceDictionary = resourceSet 
         .Cast<DictionaryEntry>() 
         .ToDictionary(entry => entry.Key.ToString(), entry => entry.Value.ToString()); 
     var json = Serializer.Serialize(resourceDictionary); 
     var javaScript = string.Format("window.Resources = window.Resources || {{}}; window.Resources.resources = {1};", json); 

     return JavaScript(javaScript); 
    } 
} 

La desventaja es que esto no permitirá más de un recurso-archivo por cada acción. De esta forma, la respuesta de @Domenics es más genérica y reutilizable.

También puede considerar el uso de OutputCache, ya que el recurso no cambiará mucho entre las solicitudes.

[OutputCache(Duration = 3600, Location = OutputCacheLocation.ServerAndClient)] 
public ActionResult GetResourcesJavaScript() 
{ 
    // Logic here... 
} 

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs

Cuestiones relacionadas