MVC2通过json从视图控制器发送集合

时间:2010-08-11 23:09:02

标签: asp.net-mvc-2 viewmodel model-view-controller

我已经在论坛上看了2天了,但是找不到一个好的答案所以我会发布它。

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

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

例如:

 $("#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中自动格式化。

4 个答案:

答案 0 :(得分:1)

您是说itemComposite.data被格式化为JSON对象?如果是这样,我很确定在将它投射到对象之前,你将不得不对其进行反序列化。类似的东西:

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

答案 1 :(得分:0)

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

JSON.NET似乎是主流框架之一:http://json.codeplex.com/releases/view/43775

希望这有帮助。

科里

答案 2 :(得分:0)

您还可以在WCF中使用JSON Serializer:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

所以不会让我把这两个链接放在一个答案中,对不起分开的答案。

答案 3 :(得分:0)

谢谢大家。我想我已经解决了我的问题,我很确定我有四个问题。在大多数情况下,我遵循了Steveve的建议并阅读了有关本文的更多内容:http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

使用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是否提供了一种简单的方法来发送这么多数据并绑定它。