使用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>");
Run Code Online (Sandbox Code Playgroud)
另一种思想流派是这样的:
string blah = "asdf";
string someJavaScript = @"
<script language='JavaScript' >
function foo()
{
var bar = '" + blah + @"';
}
</script>";
Run Code Online (Sandbox Code Playgroud)
有比这两种方法更好的方法吗?我个人喜欢第二部分,因为你可以看到整个JavaScript部分(或其他语言块,无论是SQL还是你有什么),它还有助于在该特定语言的另一个编辑器之间复制代码.
编辑:
我应该提到最终目标是在最终的网页中格式化JavaScript.
我还更改了示例以显示与生成的代码的交互.
第二种显然是方式,方式,更清晰.做第一件事根本没有任何理由.
但是,我会将其扩展到:
string someJavaScript = string.Format(@"
<script language='JavaScript' >
function foo()
{
var bar = '{0}';
}
</script>", blah);
Run Code Online (Sandbox Code Playgroud)
如果要在字符串中包含几个内容,则string.Format方法将比内联连接更具可读性.
第二种方法,虽然使用外部文件要好得多,并且允许对应用程序进行修改而无需重新编译它们.
您还需要一种很好的,可读的方式来插入变量.最简单的方法是使用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;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
string js = Insert(new { divList, url },
@"jQuery(document).ready(function(){
jQuery('#<%divList%>').jqGrid({
url:'<%url%>',
datatype: 'json',
mtype: 'GET', ... etc...");
Run Code Online (Sandbox Code Playgroud)
或者,如果脚本位于外部文件中:
string js = Insert(new { divList, url }, File.ReadAllText("someFile.js"));
Run Code Online (Sandbox Code Playgroud)
您可以传递任何对象,并且可以通过ASP样式的转义语法直接访问其属性.
显然,上面给出的实现效率不高,但它很短.
另一种可能性是编写一个返回JavaScript的.aspx页面,然后您可以将其包含在带有<script>引用的HTML页面中.您可以设置页面的ContentType是application/x-javascript.
这将允许您使用普通的ASP.NET <%= %>标记来修改它,并且已经是一个快速,强大的外部文件解决方案,在您编辑脚本时动态自动编译.