2010-11-03 19 views
5

我正在使用ASP.NET MVC,我試圖生成一段JavaScript作爲視圖呈現的一部分。我有一個模型,公開一個簡單類型的數組,我想在視圖中生成一個javascript/json等效數組,以便我可以使用jQuery對其執行操作。因此,考慮以下模型:生成原始json數組到視圖在ASP.NET MVC

public class Info { 
    public string Name {get;set;} 
    public int ID {get; set;} 
} 

public class InfoModel{ 
    public Info[] InfoList {get;set;} 
} 

...我想生成一個JavaScript數組看起來像這樣:

var infoList = [ 
     { 
     Name = "...", 
     ID = 1 
     } , 
     { 
     Name = "...", 
     ID = 2 
     }, 
     .... 
     { 
     Name = "...", 
     ID = N 
     }]; 

是否有一個很好的和簡潔的方式在視圖中要做到這一點,我如果我嘗試讓模型生成json表示形式,似乎遇到了引號編碼的問題,所以目前我只能使用一些意大利麪/經典asp代碼生成它,我寧願用一個很好的單行代碼來代替它。

編輯:請注意,我沒有找一個控制器返回一個JsonResult,我想我的視圖的方式包含一個JavaScript數組,從我的模型在一行代碼中生成(如果可能的話)

編輯: 我得到了一部分的方式,但似乎與編碼掙扎。此代碼視圖:

<script> 
var list = <%: HtmlExtension.ToJson(Model.InfoList) %>; 
</script> 

(其中的toJSON封裝轉換爲使用JavaScriptSerializer字符串)輸出一些編碼錯誤:

var info = [{&quot;Name&quot;:&quot;Low End&quot;,&quot;ID&quot;:1}]; 

..這不是我所期待的。我能做到這一點:

var info = <% Response.Write(HtmlExtension.ToJson(Model.InfoList)); %>; 

它的工作,但不看起來像閃亮。我應該顯式地忽略編碼,如圖所示(輸出是理智的,不是用戶生成的,所以它可能不是問題),還是我缺少其他東西,使其不那麼經典的ASP?

回答

5

看來你有一個編碼問題。我相信你有兩個選擇:

  1. 當你創建你的擴展,可以肯定的是它返回的MvcHtmlString代替普通string,或...
  2. 除了使用<%: ... %>風格寫出來的代碼,使用<%= ... %>不做編碼。
+0

是的!謝謝喬納森,MvcHtmlString是我正在等待的魔法... – 2010-11-03 12:58:25

+0

我能夠在我的剃刀HTML文件中使用這行代碼: MvcHtmlString.Create(Json.Encode(Model)) – bkwdesign 2013-10-11 19:06:24

+0

沒錯。最後它是'MvcHtmlString'是它的關鍵。 – 2013-10-14 16:14:55

1

是有一個很好的辦法:

InfoModel viewModel; // get this from wherever 
return Json(viewModel); 

MVC將集合轉化爲相關的JSON。

這將返回一個JsonResult(即原始JSON)。

這就是你所追求的?

如果你想要做這樣的事情在你的視野:

<script type="text/javascript> 
    var json = <%: Model.JsonStuff %> 
    // more js 
</script> 

接着上面的例子將無法正常工作。

當您構建ViewModel時,您必須手動序列化它。

編輯

這裏是你如何可以序列數據的例子。

JavaScriptSerializer js = new JavaScriptSerializer(); 
var listOfInfos; // this will be a collection (e.g List) of Infos. 
var viewModel = new InfoModel 
       { 
        InfoList = js.Serialize(listOfInfos); 
       }; 
return View(viewModel); 

只要listOfInfo的實現IEnumerable,它會序列化到JSON數組。

你可能不得不玩弄一下你的viewmodel,但那會讓你走上正確的軌道。

+0

我正在尋找第二個選項,呈現json到視圖中,沒有控制器操作返回json。我會更新這個問題來澄清。 – 2010-11-03 08:52:49

+0

@soren enemaerke - 看我的更新。 – RPM1984 2010-11-03 09:18:21

+0

感謝您的跟進,嘗試了您的方法,但效果並不理想。請看我更新的問題(ToJson封裝了js.Serialize調用以保持視圖模型不變) – 2010-11-03 11:55:32