使用javascript文件中的ASP.NET资源字符串

时间:2009-06-02 17:20:05

标签: asp.net javascript resources

如何将resx资源字符串转换为存储在.js文件中的javascript代码?

如果您的javascript位于标记的脚本块中,则可以使用以下语法:

<%$Resources:Resource, FieldName %>

它将在渲染页面时解析资源值...不幸的是,只有当javascript出现在页面正文中时才会解析。在&lt; script&gt;中引用的外部.js文件中标签,这些服务器标签显然永远不会被解析。

我不想写一个ScriptService来返回那些资源或类似的东西,因为它们在页面渲染后不会改变,因此有一些活动的东西是浪费。

一种可能性是编写一个ashx处理程序并指向&lt; script&gt;标签,但我仍然不确定如何在.js文件中读取并在将文本流式传输到客户端之前解析任何类似的服务器标签。是否有一行代码可以运行,它将像ASP.NET解析器一样执行该任务?

或者有人有任何其他建议吗?

10 个答案:

答案 0 :(得分:34)

这是我现在的解决方案。我相信我将来需要让它变得更加通用......但到目前为止这很好。

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并获取字符串。

答案 1 :(得分:19)

没有原生支持。

我不久前构建了一个JavaScriptResourceHandler,它可以通过对象将Serverside资源提供给客户端页面,其中对象上的每个属性代表本地化资源ID及其值。您可以查看此内容并从此博客文章下载:

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

我在很多应用程序中广泛使用它,效果很好。主要的胜利是你可以在一个地方(Resx或我的情况下使用数据库定制ResourceProvider)本地化你的资源,而不是必须有多个本地化方案。

答案 2 :(得分:4)

而“Common”是资源文件的名称,而Msg1是fieldname。这也适用于文化变革。

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

答案 3 :(得分:2)

简而言之,让ASP.NET为特定页面提供javascript而不是HTML。如果作为一个自定义的IHttpHandler完成最干净,但在一个页面将会做,只记得:

1)清除所有ASP.NET内容并使其看起来像JS文件。

2)在代码隐藏中将内容类型设置为“text / javascript”。

一旦有了这样的设置脚本,您就可以创建资源的客户端副本,其他客户端脚本可以从您的应用程序中引用该副本。

答案 4 :(得分:2)

如果您的资源位于单独的程序集中,则可以使用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

答案 5 :(得分:0)

我通常将资源字符串作为参数传递给我正在调用的任何javascript函数,这样我就可以继续在HTML中使用表达式语法。

答案 6 :(得分:0)

我正在处理的棕色字段应用程序我们有一个xslt,它将resx文件转换为javascript文件,作为构建过程的一部分。这很好用,因为这是一个Web应用程序。我不确定原始问题是否是Web应用程序。

答案 7 :(得分:0)

使用隐藏字段来保存资源字符串值,然后在javascript中访问字段值 例如 :   “/&gt;

var todayString = $(“input [name = TodayString] [type = hidden]”)。val();

答案 8 :(得分:0)

本文讨论了几个场景,并描述了一个很好的解决方案,与上面的Domenic的答案有点类似。 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 :(得分:0)

在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