Asp.net mvc 2 MVC2通过json从视图a控制器发送集合

Asp.net mvc 2 MVC2通过json从视图a控制器发送集合,asp.net-mvc-2,viewmodel,model-view-controller,Asp.net Mvc 2,Viewmodel,Model View Controller,我已经在论坛上找了两天了,找不到一个好的答案,所以我就把它贴出来 我似乎在将JSON发回控制器进行保存时遇到问题。JSON应该映射到模型视图,但它会不断获取默认(构造函数)值,而不是POST中的值 我们有一系列JS小部件,其中包含一个包含json的数据字段。我们在客户端的这些小部件对象中执行所有数据操作。当用户想要保存时,我们从相关的小部件中获取所需的数据,然后将其放入另一个与ViewModel匹配的JSON对象中,并将其发送回服务器 例如: $("#Save").click(function

我已经在论坛上找了两天了,找不到一个好的答案,所以我就把它贴出来

我似乎在将JSON发回控制器进行保存时遇到问题。JSON应该映射到模型视图,但它会不断获取默认(构造函数)值,而不是POST中的值

我们有一系列JS小部件,其中包含一个包含json的数据字段。我们在客户端的这些小部件对象中执行所有数据操作。当用户想要保存时,我们从相关的小部件中获取所需的数据,然后将其放入另一个与ViewModel匹配的JSON对象中,并将其发送回服务器

例如:

 $("#Save").click(function () {
        if (itemDetails.preparedForSubmit() && itemConnections.preparedForSubmit()) {
            itemComposite.data.Details = itemDetails.data;
            itemComposite.data.Connections= itemConnections.data;
            $.post(MYURL, itemComposite.data);
        } else {
            alert("failed to save");
        }
    });
preparedForSubmit()方法可以简单地执行客户端可能需要执行的任何验证检查或最后一分钟的格式设置

itemDetails窗口小部件数据与ViewModel匹配

itemConnections小部件数据与ViewModels集合相匹配

控制器如下所示:

    [HttpPost]
    virtual public JsonResult SaveItemDetailsComposite(ItemComposite inItemData)
    {
        if (ModelState.IsValid)
        {
            try
            {
               _Mapper.Save(itemComposite.Details , itemComposite.Connections);
               return Json(true);                   
            }
            catch (Exception ex)
            {
                _log.Error("Exception " + ex.InnerException.Message);
                throw;
            }
        }

        return Json(SiteMasterUtilities.CreateValidationErrorResponse(ModelState));
    }
ItemComposite类是一个简单的视图模型,它包含一个itemDetails对象和一组itemConnections。当它将数据返回到这里时,它只是获取默认数据,就好像它获得了一个新的ItemComposite,而不是转换POST数据


在Firebug中,我看到数据已发布。尽管看起来很奇怪,但它并没有在firebug中自动格式化。

您可能希望查看类似于JSON.NET的框架,以确保在将数据提供给操作时正确序列化数据

JSON.NET似乎是主流框架之一:

希望这有帮助


Cory

您是说itemComposite.data被格式化为JSON对象吗?如果是这样的话,我敢肯定,在将其强制转换到对象之前,您必须对其进行反序列化。比如:

ItemComposite ic = jsSerializer.Deserialize<ItemComposite>(this.HttpContext.Request.Params[0]);
ItemComposite ic=jsSerializer.Deserialize(this.HttpContext.Request.Params[0]);

您也可以在WCF中使用JSON序列化程序:


所以我不想把两个链接放在一个答案中,很抱歉分开回答。

谢谢大家。我想我已经解决了我的问题,我很确定我有四个问题。在大多数情况下,我遵循了thatSteveguys的建议,并阅读了更多关于本文的内容:

使用jQuery的post()方法并将json指定为类型似乎实际上并没有将其作为json发送。通过使用ajax()方法并指定json,它将其作为json发送

还需要使用JSON.serialize()方法通过JSON干净地发送

我的ViewModel设计也是一个大问题。我们使用的是MS代码分析构建垃圾,它不希望我在ViewModel中为我的集合设置一个setter。因此,我来自java/hibernate世界,认为它不需要绑定它们,它会神奇地以序列化对象的形式出现。有一次,我只是抑制了错误并重新设置了设置器。我现在正在控制器中获取集合

我相信使用MVC2 Future的值提供程序正在做一些事情,但它仍然不能可靠地转换json日期,因此我仍在研究实现这一点的最佳方法

我希望我的问题能帮助其他人


更新:使用此方法更新数据集合似乎非常慢。一个包含200个条目和每个条目8个字段的集合需要3分钟才能到达控制器。只需1或2个条目,所需时间非常短。据我所知,在这两者之间发生的唯一事情是数据绑定到模型视图。我不知道MVC2是否提供了一种发送这么多数据并进行绑定的简单方法。

我只是尝试了一下。它似乎给出了与inItemData相同的结果。Params[0]看起来像firebug向我展示的一样,ic看起来与inItemData一样。我确信这与我提出请求的方式或数据绑定的工作方式有关。参数[0]看起来像{%7b%22TaskDetails%22%3a%7b%7d%2c%22LaborTypes%22%3a%5b%7b%22LaborTypeID%22%3a93%2c%22LaborTypeID%22%3a1…您在firebug的净-->响应部分看到了这一点吗?如果是这样,它的编码是错误的。它应该看起来像json对象,而不是一堆url编码。既然您想直接发送到一个Action方法参数,请看Haack的这篇文章看看它是否有用:谢谢,我是来自GWT env的.Net noob,我会仔细阅读,看看它是如何工作的。