1

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

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

4

1 回答 1

0

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

@Html.Raw(WmsWebMvcProto.Properties.Resources.Test)
于 2013-06-20T13:24:28.137 回答