Используйте строки ресурсов ASP.NET из файлов JavaScript - PullRequest
28 голосов
/ 02 июня 2009

Как можно получить строки ресурсов resx в код JavaScript, хранящийся в файле .js?

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

<%$Resources:Resource, FieldName %>

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

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

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

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

Ответы [ 10 ]

34 голосов
/ 25 марта 2011

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

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 и получите строку.

19 голосов
/ 02 июня 2009

Нет встроенной поддержки для этого.

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

http://www.west -wind.com / Weblog / сообщений / 698097.aspx

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

5 голосов
/ 30 января 2011

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

            Partial Javascript...:
            messages: 
            {
                <%=txtRequiredField.UniqueID %>:{                       
                    required: "<%=Resources.Common.Msg1 %>",
                    maxlength: "Only 50 character allowed in required field."
                }
            }
2 голосов
/ 08 февраля 2016

Если у вас есть ресурсы в отдельной сборке, вы можете использовать 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

2 голосов
/ 02 июня 2009

Короче говоря, заставить ASP.NET обслуживать JavaScript, а не HTML для конкретной страницы. Чистота, если она сделана как пользовательский IHttpHandler, но в крайнем случае подойдет страница, просто не забудьте:

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

2) Установите для типа содержимого значение «text / javascript» в коде позади.

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

0 голосов
/ 09 мая 2018

Добавьте функцию в классе BasePage:

    protected string GetLanguageText(string _key)
    {
        System.Resources.ResourceManager _resourceTemp = new System.Resources.ResourceManager("Resources.Language", System.Reflection.Assembly.Load("App_GlobalResources"));
        return _resourceTemp.GetString(_key);
    }

Javascript:

    var _resurceValue = "<%=GetLanguageText("UserName")%>";

или прямое использование:

    var _resurceValue = "<%= Resources.Language.UserName %>";

Примечание: Язык - это мое имя. Экзамен: Language.resx и Language.en-US.resx

0 голосов
/ 06 сентября 2012

В этой статье рассматриваются несколько сценариев и описывается хорошее решение, которое немного похоже на ответ Доменика, приведенный выше. http://michael -sander.eu / index.php / 2010/07/29 / с использованием локализованного-ресурсы-в-JavaScript-файлов-в-Asp-MVC-проект / комментарий-страница-1 / # комментарии-219

0 голосов
/ 16 марта 2011

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

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

0 голосов
/ 13 июля 2010

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

0 голосов
/ 02 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...