我希望JavaScript代码与视图分开 我得到了为JavaScript生成的简单图像按钮实现本地化的要求:
<img src="..." onclick="..." title="Close" />
本地化标题的最佳技巧是什么?
PS:我发现Ayende a solution。这是正确的方向。
编辑:
我得到了Localization helper类,它提供了Controller.Resource('foo')
扩展方法。
我正在考虑扩展它(帮助器),以便它可以通过名称返回指定控制器的所有JavaScript资源(来自App_LocalResources
中的“ClientSideResources”子文件夹)。然后 - 在BaseController
中调用它,将其添加到ViewData
并在Layout
中呈现。
这会是一个好主意吗?
答案 0 :(得分:9)
修改强>
考虑将必要的本地化资源写入JavaScript对象(哈希),然后使用它来查找动态创建的对象。我认为这比回到服务器进行翻译更好。这与通过viewdata添加它类似,但可能更灵活一些。 FWIW,我可以认为本地化资源是View的一部分,而不是控制器的一部分。
在视图中:
<script type="text/javascript"
src='<%= Url.Content( "~/Resources/Load?translate=Close,Open" %>'></script>
会输出如下内容:
var local = {};
local.Close = "Close";
local.Open = "Open";
没有参数,它将输出整个翻译哈希。使用参数可以为每个视图自定义它。
然后,您可以在JavaScript文件中使用它,例如:
$(function(){
$('#button').click( function() {
$("<img src=... title='" + local.Close + "' />")
.appendTo("#someDiv")
.click( function() { ... } );
});
});
实际上,只要JavaScript代码本地化在容器中,我就不会太过于担心将JavaScript代码保留在我的视图之外。通常我会在主页面上设置4个内容区域:标题,标题,主要和脚本。标题,标题和主要去你想象的地方,脚本区域位于正文的底部。
我将所有JavaScript包括(包括任何用于viewusercontrols的)包含在脚本容器中。特定于视图的JavaScript代码位于包含之后。我根据需要将共享代码重构为脚本。我曾考虑使用控制器方法来整理脚本包含,即使用单个请求包含多个脚本,但尚未解决这个问题。
这样做的好处是可以保持JavaScript代码的可读性,但也允许我根据需要轻松地将模型或视图数据注入JavaScript代码。
答案 1 :(得分:2)
实际上,ASP.NET Ajax有一个内置的本地化机制:Understanding ASP.NET AJAX Localization
答案 2 :(得分:1)
如果你坚持要将它分开,你可以这样做:
//keep all of your localised vars somewhere
var title = '{title_from_server}';
document.getElementById('someImage').title = title;
请记住,如果您使用JavaScript代码初始化任何元素文本,那么您的网站将在JavaScript无法使用的地方发生可怕的降级。