2009-05-20 67 views
5

使用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。

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

+0

我一直在问这个问题。而第二个看起来更清洁,接下来尝试控制的动态命名...然后它变得更丑,因为您必须使用Control.ClientID – 2009-05-20 18:51:09

+0

document.getElementById(“”“+ String.Format(”{0} _ {1}“) ,base.ClientID,“foobar”)+ @“”“).... – 2009-05-20 18:55:36

回答

7

第二显然是方式,方法,更清晰。做第一个事情根本没有任何理由。

我会,但是,它延伸到这一点:

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

如果你有几件事情要坚持字符串内,String.Format方法将成为而非直列串联更具可读性。

3

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

+0

是的..这只是使它很难与之合作。他们已经从与MOSS合作的劣势开始,最好在大多数情况下做这样的事情。 – 2009-05-20 18:52:54

+0

如果您仔细组织代码,则不是。我的经验是,通常只有几个ID,并且必须从服务器端代码中提取。这些可以像上面那样嵌入初始化器中。如果你想格式化和可读性,使用JS文件。 – Ishmael 2009-05-20 19:01:53

+0

@Ishmael,你能提供一个在你的资源中使用初始值设定项的例子吗? – 2009-05-20 19:29:09

1

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

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

5

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

您还需要一个很好的,可读的方式来插入变量。最简单的方法是使用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页面,然后可以用<script>引用将它包含在HTML页面中。您可以将set the ContentType of the page设置为application/x-javascript

这将让你使用普通的ASP.NET <%= %>标签来修改它,并且已经是一个快速,强大的外部文件解决方案,当你编辑脚本时,它将自动编译。

1

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

总之,你的例子可以写成:

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

其一,它会确保该嗒嗒变量的内容被正确引用,如果它包含特殊字符,例如。