MVC3 (Razor) Json 获取Controller中的反序列化数据

Posted

技术标签:

【中文标题】MVC3 (Razor) Json 获取Controller中的反序列化数据【英文标题】:MVC3 (Razor) Json Get deserialized data in the Controller 【发布时间】:2012-06-08 19:23:05 【问题描述】:

我再次需要有关 Asp.Net MVC(Razor 视图引擎)的帮助。 在我的视图(索引)中,我有

@model IEnumerable<Movie>

我想将模型传递给控制器​​:我以这种方式对模型进行字符串化:

<script type="text/javascript">
function postData()
var urlact='@Url.Action("createDoc")';
var model ='@html.Raw(Json.Encode(Model));

$.ajax(
    data: JSON.stringify(model),
    type:"POST",
    url:urlact, 
    datatype:"json",
    contentType:"application/json; charset=utf-8"
);

</script>

似乎一切正常,因为我知道字符串化数据是:

'["ID":1,"Title":"The Lord of the Rings: The Fellowship of the Ring","ReleaseDate":"\/Date(1007938800000)\/","Genre":"Fantasy","Price":93000000.00,"ID":2,"Title":"The Lord of the Rings: The Two Towers","ReleaseDate":"\/Date(1039042800000)\/","Genre":"Fantasy","Price":94000000.00,"ID":3,"Title":"The Lord of the Rings: The Return of the King","ReleaseDate":"\/Date(1070233200000)\/","Genre":"Fantasy","Price":94000000.00]';

问题是:在 Controller 中,methodName "createDoc"(如脚本中声明的)我无法访问字符串化数据。 根据网上建立的一些示例,我的方法是这样的:

[HttpPost]
    public ActionResult createDoc(IEnumerable<Movie> movies)
    
        //...using movies list
        return View();
    

为什么我无法访问字符串化数据?我该怎么做,是否有一些方法可以调用来反序列化 Controller 方法中的模型? 另外,我可以使用 serialize() 方法而不是 stringify() 方法吗?如果是这样,View & Controller 端的语法是什么?

谢谢。

【问题讨论】:

您遇到的错误是什么?电影参数是否为空?它会抛出错误吗? 不,我根本无法对我的 createDoc 操作执行任何操作。似乎没有任何内容发布到它。 (不知道,可能入参的声明有误) 【参考方案1】:

您已经在 J​​avaScript 变量 model 中获得了字符串化数据。您只需要在不是字符串的对象上调用JSON.stringify

如果您想在不修改model 的情况下将数据发布到您的操作中,只需传入model 而不使用JSON.stringify,ModelBinder 会为您将其反序列化为IEnumerable&lt;Movie&gt;

如果您想将model 用作字符串以外的东西,您需要在字符串上调用JSON.parse。换句话说:

var model = JSON.parse('@Html.Raw(Json.Encode(Model))');

那么,您需要保留您的JSON.stringify 电话。

最后,stringify 是浏览器特定对象 JSON 上的方法,而 serialize 是 ASP.NET MVC 特定 Json 对象上的方法。两个不同的世界,同名。

【讨论】:

在这种情况下没有必要使用 JSON.parse,因为 HTML.Raw 已经将返回原始 json。所以就这样做吧:var model = JSON.parse('@Html.Raw(Json.Encode(Model))'); 这很好,除非您需要在 json 字符串中转义任何单引号 'JSON.parse('@Html.Raw(Json.Encode(Model).Replace("'", "\\'"))');

以上是关于MVC3 (Razor) Json 获取Controller中的反序列化数据的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 razor 获取视图中的浏览器屏幕宽度和高度

MVC3.0 中Razor 学习

使用razor/asp.net mvc3生成静态html页面?

MVC3 Razor - 模型和视图

MVC3 Razor @RenderSection

MVC3 Razor @RenderSection