2009-06-02 1 views
28

Как получить строки ресурсов resx в javascript-код, хранящийся в файле .js?Использование строк ресурса ASP.NET из файлов javascript

Если ваш браузер в блоке сценария в разметке, вы можете использовать этот синтаксис:

<%$Resources:Resource, FieldName %> 

и он будет анализировать значение ресурса, как это делает страницы ... К сожалению, это только будет анализируется, если javascript отображается в теле страницы. Во внешнем файле .js, указанном в теге < >, эти теги сервера, очевидно, никогда не анализируются.

Я не хочу писать ScriptService, чтобы возвращать эти ресурсы или что-то в этом роде, поскольку они не меняются после того, как страница отображается, поэтому отходы имеют что-то активное.

Возможно, существует одна возможность написать обработчик ashx и указать на это < скрипт >, но я до сих пор не уверен, как я буду читать файлы .js и разбирать любые теги сервера, подобные этому, перед потоковой передачей текста для клиента. Есть ли строка кода, которую я могу запустить, которая будет выполнять эту задачу аналогично парсеру ASP.NET?

Или у кого-нибудь есть другие предложения?

ответ

19

Для этого не существует соответствующей поддержки.

Я создал JavaScriptResourceHandler некоторое время назад, которое может обслуживать ресурсы Serverside на странице клиента через объекты, где каждое свойство объекта представляет собой идентификатор ресурса локализации и его значение. Вы можете проверить это и скачать его с этого блога:

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

Я использую это экстенсивно в ряде приложений и работает хорошо. Основная победа в этом заключается в том, что вы можете локализовать свои ресурсы в одном месте (Resx или в моем случае пользовательский ResourceProvider с использованием базы данных), а не иметь несколько схем локализации.

+0

Хм, интересный подход. Могу работать для меня. Недостатки в том, что у меня должен быть отдельный файл ресурсов только для того, что я хочу вытолкнуть или отправить лишние вещи, которые не нужны ... и что я ' m внутри sharepoint, поэтому чтение resx в файле и разбор его может быть проблемой, мы увидим. Спасибо за сообщение! – Grank

0

Обычно я передаю строку ресурса в качестве параметра любой функции javascript, которую я вызываю, поэтому я могу продолжать использовать синтаксис выражения в HTML.

+0

Это, как правило, быть моей склонности, а также, но в данном случае, это на стороне клиента пункт нажал обработчик для RadMenu, так что это приводит к переключению заявления с 7 случаев, все отображения разные "ты уверен?" strings :( – Grank

2

Вкратце, чтобы ASP.NET служил javascript, а не HTML для определенной страницы. Самый чистый, если сделать это как пользовательский IHttpHandler, но в крайнем случае страница будет делать, просто запомните:

1) Очистите все материалы ASP.NET и сделайте их похожими на JS-файл.

2) Задайте тип содержимого «text/javascript» в коде.

После того, как у вас есть сценарий, подобный этой настройке, вы можете создать клиентскую копию своих ресурсов, которую могут ссылаться на других клиентских сценариях из вашего приложения.

0

Я использую приложение для коричневого поля. У меня есть xslt, который преобразует файл resx в файл javascript как часть процесса сборки. Это хорошо работает, поскольку это веб-приложение. Я не уверен, является ли исходный вопрос веб-приложением.

4

тогда как «Common» - это имя файла ресурсов, а Msg1 - имя поля. Это также способствует изменению культуры.

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

Спасибо! работает отлично. 'code alert (" <% = Resources.LocalizedText.ErrorMessage%> ");' – Equiman

0

использовать скрытое поле для хранения значения строкового ресурса, а затем получить доступ к значению поля в JavaScript , например: "/>

вар todayString = $ (" вход [имя = TodayString] [ тип = скрытый] ") вал();..

32

Вот мое решение сейчас я уверен, что мне нужно будет сделать его более универсальным в будущем ... но до сих пор это хорошо

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" }); 
.

Так что я могу сделать

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

, а затем мои скрипты могут ссылаться, например, window.Resources.Foo.Bar и получите строку.

+0

Я использую Framework 4, мое приложение - это Web, я должен добавить ссылку на System.Windows.Forms.dll, чтобы решить метод ResXResourceReader. Я не могу заставить это входить в «ResourceController», Класс ResourceController находится в папке App_GlobalResources. Я установил файл resx как Build Action: Resource. Я поставил точку останова и ничего. –

+0

Класс для сериализации в JSON называется 'JavaScriptSerializer', а не' Serializer', и он не является статическим. – modiX

+0

Я пытаюсь использовать это, но я никогда не достигаю в контроллере. У меня есть точка разрыва в действии, но она так и не дошла. Плюс _ _ Это будет добавлено в файл _layout.chtml? – mohsinali1317

0

Если у вас есть ресурсы в отдельной сборке, вы можете использовать ResourceSet вместо имени файла. Опираясь на @Domenics большой ответ:

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); 
    } 
} 

Недостатком является то, что это не позволит более одного ресурса-файл для каждого действия. Таким образом @Domenics ответ более общий и многоразовый.

Вы также можете использовать OutputCache, так как ресурс не будет сильно изменяться между запросами.

[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