2010-11-03 43 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

相关问题