【问题标题】:How do you embed other programming languages into your code?您如何将其他编程语言嵌入到您的代码中?
【发布时间】:2009-05-20 18:47:38
【问题描述】:

使用 C# 进行 ASP.NET 和 MOSS 开发,我们经常需要将 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 还是其他语言),它还有助于在该特定语言的另一个编辑器之间复制代码。

编辑:
我应该提到,最终目标是在最终网页中格式化 JavaScript。

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

【问题讨论】:

  • 我也一直想问这个问题。虽然第二个看起来更干净,但接下来尝试动态命名控件......然后它变得更加丑陋,因为您必须使用 Control.ClientID
  • document.getElementById(""" + String.Format("{0}_{1}", base.ClientID, "foobar") + @""") ....跨度>

标签: c# javascript


【解决方案1】:

第二个显然方式,方式,更清晰。做第一个真的没有任何理由。

不过,我会将其扩展到以下内容:

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

如果你要在字符串中添加一些东西,那么 string.Format 方法将变得比内联连接更具可读性。

【讨论】:

  • 这是一个非常好的建议,尽管使用一堆替代品可能会很快变得笨拙。
  • 那么您是否正确编码了您放入其中的那些字符串?如果那里有撇号或反斜杠怎么办?或者,天堂禁止,小于运算符?
【解决方案2】:

第二种方式,虽然使用外部文件要好得多,并且允许对应用程序进行修改而无需重新编译。

您还需要一种美观、易读的方式来插入变量。最简单的方法是使用 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 样式的转义语法直接访问其属性。

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

另一种可能性是编写一个返回 JavaScript 的 .aspx 页面,然后您可以使用 &lt;script&gt; 引用将其包含在您的 HTML 页面中。您可以将set the ContentType of the page 设为application/x-javascript

这将允许您使用普通的 ASP.NET &lt;%= %&gt; 标记来修改它,并且已经是一个快速、强大的外部文件解决方案,在您对脚本进行编辑时自动编译。

【讨论】:

  • 你能举个例子把它放在一个外部文件中以避免重新编译吗?没有人提供的答案提到将它放在可执行文件的资源部分,但这需要重新编译才能更改它。
  • 我添加了一个非常简单的示例 - 如果您正在构建此类应用程序,您可能希望使用 ASP.NET 路径映射函数在您的网络中定位文件应用程序。
  • 非常有趣。我想知道这如何轻松地转化为 MOSS Web 部件/解决方案范式......
【解决方案3】:

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

【讨论】:

  • 是的..这只是让它很难使用。他们已经从不得不与 MOSS 合作的劣势开始,在大多数情况下最好只做这样的事情。
  • 如果您仔细组织代码,则不会。我的经验是,通常只有几个 ID,因此您必须从服务器端代码中提取。这些可以像上面那样插入到嵌入的初始化程序中。如果您想要格式和可读性,请使用 JS 文件。
  • @Ishmael,你能提供一个在你的资源中使用初始化器的例子吗?
  • none,如果将JS作为嵌入脚本加载到资源部分,还是要重新编译才能改变,对吧?将其直接放入您的代码有什么好处?
  • 是的,通常如果您更改可执行文件中的任何内容,您将不得不重新编译您的应用程序,即使您当然可以只使用资源编辑器(例如 PE 资源管理器)。主要的好处是将不同的文件表示为可执行文件中的部分,因此您的 c# 代码和 javascript 之间存在一种分离形式,使其更易于维护/更新,同时保持一切仍然独立(否则您也可以只需加载一个独立的 *.js 文件)。此外,如果需要,您当然可以轻松加密嵌入式 js 文件。
【解决方案4】:

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

(性能不是问题,这是我们正在谈论的MOSS......)

【讨论】:

  • 这适用于很多语言,例如——在VB中嵌入SQL。
【解决方案5】:

我们为此目的编写了一个库,它提供了一种流畅的语法来将 JavaScript 嵌入到 C# 代码中。你可以阅读更多关于它的信息here

简而言之,你的例子可以写成:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2010-09-16
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2015-08-18
    • 2023-03-10
    相关资源
    最近更新 更多