2011-10-27 92 views
0

我在我的控制器下面的代碼:如何逃脫撇號asp.net-MVC和JavaScript

public ActionResult MyPage() 
    { 
     var vm = new MyViewModel(); 
     vm.StringList = "'" + String.Join("','", MyModel.GetList().Select(r => r.Name).ToArray()) + "'"; 

     return View(vm); 
    } 

和我的asp.net MVC的觀點,我有以下代碼:

var myJavascriptArray = [<%=Model.StringList %>]; 

一個javascript函數內部

這工作得很好,直到其中一個名字:

MyModel.GetList() 

調用有像「比爾·奧布賴恩」

中有一個撇號的,因爲它認爲,弄亂我的JavaScript代碼「後,O爲該條目和換行符結束。

是什麼而逸出該字符的,所以我可以有一個數組在那樣的JavaScript將最終顯示爲這樣的最佳方式:

變種myJavascriptArray = [「」項目1' ,第2' 項, '項目3','項目4'];

並處理'Bill O'Brien'是條目之一。

+0

另外,爲什麼要創建由單引號包圍的字符串文字? '「Bill O'Brien」'在JavaScript中工作得很好。 – Marc

回答

6

你試圖做一些與所有這些手冊撇號和東西的JSON序列化? 請勿

簡單地定義將包含名稱的列表視圖模型:

public class MyViewModel 
{ 
    public string[] Names { get; set; } 
} 

,你將在你的控制器填充和傳遞給視圖:

public ActionResult MyPage() 
{ 
    var model = new MyViewModel 
    { 
     Names = MyModel.GetList().Select(r => r.Name).ToArray() 
    } 
    return View(model); 
} 

,並在視圖中JSON序列化此屬性:

var myJavascriptArray = <%= new JavaScriptSerializer().Serialize(Model.Names) %>; 

或者如果您使用ASP.NET MVC 3:

var myJavascriptArray = <%= Json.Encode(Model.Names) %>; 

,這將導致在視圖串的正確JSON編碼數組:

var myJavascriptArray = ["name 1", "name 2", "name 3"]; 

,您可以操控作爲正常JS數組:

alert(myJavascriptArray[1]); 

顯然這種技術作品具有比簡單的字符串數組更復雜的對象圖。您可以安全地序列化整個對象模型,而不用擔心單引號,雙引號,括號等等。當然,除了所有這些,JavaScript序列化器將處理像Bill O'Brien這樣的名稱並對它們進行正確編碼。