摘要

有没有什么方法可以使ASP.NET MVC应用程序中的捆绑和缩小过程在缩小脚本文件之前在脚本文件中执行“搜索并替换”?

背景

我在Javascript文件中定义了一些小部件,这些小部件包含需要根据当前用户的语言翻译成不同语言的单词。由于MVC将javascript文件缩小到了ScriptBundles中,是否有可能进入此构建过程?理想情况下,我们可以使用它来创建本地化的脚本包,在该过程中,绑定过程会在缩小脚本之前在脚本内执行搜索/替换。

我想避免手动为每种语言创建单独的javascript文件,因为这会使维护变得困难。对于客户端字典,小部件将从中提取文本也是如此。我们已经在javascript性能方面遇到问题,并且不想添加另一层前端计算。

最佳答案

正如弗拉基米尔(Vladimir)所说,只需实现IBundleTransform,即可创建自己的Bundle转换。我写了一篇有关捆绑和缩小Coffeescript的博客文章,可以为您指明正确的方向:http://tallmaris.com/advanced-bundling-and-minification-of-coffeescripts-in-mvc4/

总之,创建一个这样的自定义转换:

public class MultiLanguageBundler : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        foreach (var file in response.Files)
        {
            using (var reader = new StreamReader(file.FullName))
            {
                // "ReplaceLanguageStrings" contains the search/replace logic
                compiled += ReplaceLanguageStrings(reader.ReadToEnd());
                reader.Close();
            }
        }
        response.Content = compiled;
        response.ContentType = "text/javascript";
    }
}


然后在您的BundleConfig中:

var myBundle = new Bundle("~/Scripts/localised")
                   .Include("~/JsToLocalise/*.js"); //your JS location here, or include one by one if order is important.
myBundle.Transforms.Add(new MultiLanguageBundler());
myBundle.Transforms.Add(new JsMinify());
bundles.Add(myBundle);


您可能需要进行一些调整,但是请告诉我是否有帮助。

关于c# - 捆绑前在Javascript中搜索和替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18509506/

10-12 12:28
查看更多