2013-02-26 75 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