代码之家  ›  专栏  ›  技术社区  ›  Nathan DeWitt

如何在代码中嵌入其他编程语言?

  •  5
  • Nathan DeWitt  · 技术社区  · 16 年前

    在ASP.NET和MOSS开发中使用C#时,我们通常必须将JavaScript嵌入到C#代码中。为了实现这一点,似乎有两种流行的思想流派:

    string blah = "asdf";
    StringBuilder someJavaScript = new StringBuilder();
    someJavaScript.Append("<script language='JavaScript' >");
    someJavaScript.Append("function foo()\n");
    someJavaScript.Append("{\n");
    someJavaScript.Append("  var bar = '{0}';\n", blah);
    someJavaScript.Append("}\n");
    someJavaScript.Append("</script>");
    

    string blah = "asdf";
    string someJavaScript = @"
        <script language='JavaScript' >
        function foo()
        {
          var bar = '" + blah + @"';
        }
        </script>";
    

    有比这两种方法更好的方法吗?我个人喜欢第二个,因为您可以看到JavaScript的整个部分(或其他语言块,无论是SQL还是其他语言块),它还可以帮助在该特定语言的另一个编辑器之间复制代码。

    编辑:

    我还更改了示例以显示与生成代码的交互。

    5 回复  |  直到 16 年前
        1
  •  7
  •   mqp    16 年前

    第二个很明显,很清楚。根本没有任何理由做第一件事。

    不过,我想把它扩展到:

    string someJavaScript = string.Format(@"
        <script language='JavaScript' >
          function foo()
          {
              var bar = '{0}';
          }
        </script>", blah);
    

    如果在字符串中有一些内容需要粘贴,则string.Format方法将比内联连接更具可读性。

        2
  •  5
  •   Daniel Earwicker    16 年前

    第二种方法,尽管使用外部文件要好得多,并且允许在不重新编译的情况下对应用程序进行修改。

    您还需要一种好的、可读的方式来插入变量。最简单的方法是使用string.Format,但每个变量都是{0}或{1},因此可能无法读取。

    public static string Insert(object dictionary, string into)
    {
        foreach (PropertyInfo property in dictionary.GetType().GetProperties())
            into = into.Replace("<%" + property.Name + "%>", 
                                property.GetValue(dictionary, null).ToString());
    
        return into;
    }
    

    然后你可以这样做:

    string js = Insert(new { divList, url }, 
                       @"jQuery(document).ready(function(){
                            jQuery('#<%divList%>').jqGrid({
                                url:'<%url%>',
                                datatype: 'json',
                                mtype: 'GET', ... etc...");
    

    或者,如果脚本位于外部文件中:

    string js = Insert(new { divList, url }, File.ReadAllText("someFile.js"));
    

    您可以传递任何对象,其属性将通过ASP样式的转义语法直接访问。

    显然,上面给出的实现不是很有效,但它很短。

    <script> 参考你可以 set the ContentType of the page application/x-javascript .

    <%= %>

        3
  •  3
  •   none    16 年前

    如何将JavaScript作为资源部分添加到文件中,以便从可执行文件的资源部分将其作为(嵌入式)脚本加载?

        4
  •  1
  •   Matt Hinze    16 年前

    字符串文字有一个原因:可读性。

        5
  •  1
  •   Dave Van den Eynde    14 年前

    我们为此编写了一个库,它提供了在C#代码中嵌入JavaScript的流畅语法。你可以阅读更多关于它的内容 here

    var function = JS.Function("foo").Do(
        JS.Var(JS.Id("bar").AssignWith(blah)));
    string someJavaScript = "<script>" + function + "</script>";
    

    例如,如果blah变量包含特殊字符,它将确保blah变量的内容被正确引用。