Подтвердить что ты не робот

Использовать строки ASP.NET Resource из файлов javascript

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

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

<%$Resources:Resource, FieldName %>

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

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

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

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

4b9b3361

Ответ 1

Там нет встроенной поддержки.

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 9

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