Использовать строки ASP.NET Resource из файлов javascript
Как получить строки ресурсов resx в javascript-код, хранящийся в файле .js?
Если ваш javascript находится в блоке script в разметке, вы можете использовать этот синтаксис:
<%$Resources:Resource, FieldName %>
и он будет анализировать значение ресурса, поскольку он отображает страницу... К сожалению, это будет проанализировано только в том случае, если javascript появится в теле страницы. Во внешнем файле .js, указанном в <script> тег, те теги сервера, очевидно, никогда не будут разбираться.
Я не хочу писать ScriptService, чтобы возвращать эти ресурсы или что-то в этом роде, так как они не меняются после того, как страница отображается, поэтому у нее есть что-то активное.
Одной из возможностей может быть запись обработчика ashx и указание на <script> теги к этому, но я все еще не уверен, как я буду читать в .js файлах и анализировать любые теги сервера, подобные этому, перед потоковой передачей текста клиенту. Есть ли строка кода, которую я могу запустить, которая будет выполнять эту задачу аналогично парсеру ASP.NET?
Или у кого-нибудь есть другие предложения?
Ответы
Ответ 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();
Ответ 8
В этой статье обсуждается несколько сценариев и описывается хорошее решение, которое похоже на вышеупомянутый Доменический ответ.
http://michael-sander.eu/index.php/2010/07/29/using-localized-resources-in-javascript-files-in-a-asp-mvc-project/comment-page-1/#comment-219
Ответ 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