2013-02-26 76 views
4

我将一个C#字符串数组传递给使用TagBuilder构建一些Javascript的方法。我似乎并没有能够得到在我的javascript数组中的实际项目:将C#字符串数组转换为Javascript数组

public static IHtmlString NewsTicker(this HtmlHelper htmlHelper, string[] arrTickerContents) 
    { 
     TagBuilder script = new TagBuilder("script"); 
     script.Attributes.Add("type", "text/javascript"); 

     script.InnerHtml = @" 

      var rss_scr_contents = new Array(); 

      $.each('" + arrTickerContents + @"', function (i, objValue) { 
       rss_scr_contents[i] = objValue; 
     }); 

     return MvcHtmlString.Create(script.ToString()); 
    } 

这将导致下面的源代码:

var rss_scr_contents = new Array(); 

      $.each('System.String[]', function (i, objValue) { 
       rss_scr_contents[i] = objValue; 
     }); 

什么是正确的语法做这个?

回答

1

问题是arrTickerCountents.ToString()没有返回预期的结果。

例如,(new [] {"hello", "world"}).ToString()评估为"System.String[]",这在这里没有用。

处理此问题的有效方法是使用转换,而不是从合适的.NET对象中发出有效的JavaScript值 - 最常用的工具可能是JSON转换器。我喜欢Json.NET,但这应该与其他转换器一起使用。

var jsonArray = JsonConvert.SerializeObject(arrTickerContents); 
script.InnerHtml = @" 
     var rss_scr_contents = []; 
     $.each(" + jsonArray + @", function (i, objValue) { 
      rss_scr_contents[i] = objValue; 
     }) 
"; // Please make sure to post valid code 

由于上述循环没有像现在这样处理,所以考虑更简单的选择。 (我宁愿不使用var全球窗口属性。)

script.InnerHtml = @"rss_scr_contents = " + jsonArray + ";"; 

我建议JSON它的简单和可自动转换,尽管它可能并不总是适用。手动构建JavaScript值(即不使用JSON库)应小心谨慎,因为引入无效的,恶意的或意外的输出相当容易。

+1

优秀的答案! – user517406 2013-02-26 22:15:57

0
$.each('[' + string.Join(',', arrTickerContents), + ']', function (i, objValue) { 
+0

-1因为虽然这*可能*工作,它真的没有比在SQL中使用占位符更好。不能保证这个手册中的-js-array会产生一个有效的文字,并且输入甚至不像'int []'那样受限制,因此它可能会破坏给定中的许多*(也许是大部分)值输入。我建议只使用“to JSON”。 – 2013-02-26 21:54:11

+0

@pst,嗯......这就是问了什么,这是什么回答,当然,你可以downvote,虽然它很奇怪... – gdoron 2013-02-26 21:56:30

+0

重新阅读我的评论。下面是这段代码可能产生的一些无效输出:'[1,hello world!,alert(“\ o /”)]]'。 – 2013-02-26 21:57:05