Knockoutjs模板文件和本地化的resx文件

时间:2013-06-20 12:35:08

标签: javascript .net asp.net-mvc-4 knockout.js resourcebundle

尝试在Web API之上构建SPA应用程序我遇到了一个问题。 在我的项目中,我使用Resource.resx文件来本地化显示的信息。 当我以.cshtml格式创建视图时,这不是问题,但是当我使用Knockout模板时,我遇到了问题,因为它们是.html,我无法再直接访问Resource.resx。

我认为有几个选项,包括从Web API发送本地化字符串和模型,在.cshtml文件中创建javascript变量并在.html中访问它们并创建一个javascript本地化文件(包含常量,或从.resx获取值。

任何人都对如何解决这个问题有任何好的想法?

编辑: 好吧,我能想到的两个最可行的解决方案是在.cshtml文件中打印本地化字符串,如下所示:

@functions{
    public string LocalizedString()
    {
        return Resource.MyLocalizedString;
    }
}
<input id="LocalizedString" type="hidden" value="@LocalizedString()" />

然后使用jquery和输入的id

获取值
$("#LocalizedString").val()

所以我可以填充一个我可以在应用程序中引用的localized.js文件。

另一个选择是创建一个wep api服务,该服务提供我在我的应用程序中需要的字符串的json列表。

    public HttpResponseMessage Get()
    {
        var localString = new Dictionary<string, string> {
            {"FullName", Resource.ACC_FullName},
            {"LastName", Resource.ACC_LastName},
            {"FirstName", Resource.ACC_FirstName}
        };
        return Request.CreateResponse(HttpStatusCode.OK, localString);
    }

女巫将返回此JSON

{
fullName: "Fullt navn",
lastName: "Etternavn",
firstName: "Fornavn"
}

然后可以将其存储在localstorage中(我知道初始问题与淘汰相关,这个代码是angularjs,但我知道你可以用类似的东西进行淘汰

gets(): void {
            this.http({ method: 'GET', url: '/api/locals' }).
                success(function (data, status, headers, config) {
                    angular.forEach(data, function (value, key) {
                        localStorage.setItem(key, value);
                    });
                }).
                error(function (data, status, headers, config) {
                    this.$log.warn(data, status, headers, config);
                });
        }
然后可以使用

在页面上使用

localStorage.getItem('Key')

编辑:在AngularJS的情况下,您可以使用内置缓存的$ http,非常聪明。

第一个解决方案可能会使DOM中的变量更快,至少在脚本执行时它们会存在,但我不喜欢用我真正应该存在的东西来混淆我的html的想法。 另一个解决方案清理html,但我必须进行api调用才能获取值,并且这些值将无法使用,直到返回该调用。女巫意味着我可能需要延迟依赖于那些值的脚本的执行,直到完成为止。但是响应不会很大,我们总共说了50到100个字符串(对于我的网站至少)。

现在,我还没有实现任何这些解决方案,我不知道它们是否有任何好处。所以,如果有人有任何意见或想法,我想听听他们。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。由于我没有使用Knockout.js的经验,我不确定它是否对您有所帮助。我在我的资源文件中有一个名为Test的字符串,我可以使用我的cshtml中的以下代码行在前端显示它:

@Html.Raw(WmsWebMvcProto.Properties.Resources.Test)