javascript - Knockoutjs 模板文件和本地化 resx 文件

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

在 Web API 上尝试构建 SPA 应用程序时,我遇到了一个问题。 在我的项目中,我使用 Resource.resx 文件来本地化显示的信息。 当我以 .cshtml 格式创建 View 时,这不是问题,但当我使用 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"
}

然后可以将其存储在本地存储中(我知道最初的问题与 knockout 相关,并且此代码是 angularjs,但我知道您可以使用 knockout 以类似的方式做到这一点)

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 个字符串(至少对于我的网站而言)。

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

最佳答案

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

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

关于javascript - Knockoutjs 模板文件和本地化 resx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17213782/

相关文章:

c# - 在预定义的时间高效运行数十万个函数

c# - 从 ASP.NET Web API 返回 HTML

asp.net-mvc-4 - 将模型绑定(bind)到 ASP.NET MVC4 中的单选按钮?

javascript - Angularjs - http 请求已取消 - 报告 404

javascript - 事件监听器之后的 ",true);"有何作用?

javascript - ESLint - ReactJS 中没有未使用的表达式

javascript - jquery 滚动到通过 ajax 动态创建的元素

.net - AutoMapper AssertConfiguration 在编译时?

c# - 可以使用 Assert 作为前置条件吗?

asp.net-mvc - Asp.Net MVC 4 模型