【问题标题】:MVC2 sending collections from the view a controller via jsonMVC2通过json从视图发送集合到控制器
【发布时间】:2010-08-11 23:09:02
【问题描述】:

我在论坛上找了 2 天了,没有找到好的答案,所以我就发布它。

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

我们有一系列 JS 小部件,其中包含一个带有 json 的数据字段。我们在客户端的这些小部件对象中进行所有数据操作。当用户想要保存时,我们从相关的小部件中获取我们需要的数据,然后将其放入与 ViewModel 匹配的另一个 JSON 对象中,然后将其 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 小部件数据与 ViewModel 集合匹配。

控制器如下所示:

    [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 中没有自动格式化。

【问题讨论】:

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


    【解决方案1】:

    您是说 itemComposite.data 被格式化为 JSON 对象吗?如果是这样,我很确定您必须先对其进行反序列化,然后才能将其转换为您的对象。比如:

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

    【讨论】:

    • 我刚试过这个。它似乎给了我与 inItemData 相同的结果。 Params[0] 看起来像我的萤火虫显示给我的,而 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 Method 参数,请查看 Haack 的这篇文章,看看是否有帮助:haacked.com/archive/2010/04/15/…
    【解决方案2】:

    您可能需要研究 JSON.NET 之类的框架,以确保您的数据在提供给您的 Action 时被正确序列化。

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

    希望这会有所帮助。

    科里

    【讨论】:

    • 谢谢,我是来自 GWT 环境的 .Net 菜鸟,我会仔细阅读它,看看它是如何工作的。
    【解决方案3】:

    您也可以在 WCF 中使用 JSON 序列化程序:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

    所以不会让我将两个链接放在一个答案中,对于拆分答案感到抱歉。

    【讨论】:

      【解决方案4】:

      谢谢大家。我想我已经解决了我的问题,我很确定我有四个问题。在大多数情况下,我遵循了 Steveguys 的建议并阅读了这篇文章的更多内容: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 中为我的集合设置一个设置器。所以我来自 java/hibernate 世界,认为它不需要它们绑定,它会神奇地作为序列化对象出现。一旦我抑制了错误并重置了我的设置器。我现在在我的控制器中获取集合。

      我相信使用 MVC2 Future 的价值提供者正在做一些事情,但它仍然不能可靠地转换 json 日期,所以我仍在研究最好的方法来做到这一点。

      我希望我的问题对其他人有所帮助。

      UPDATE:使用此方法更新数据集合似乎超级慢。包含 200 个条目和每个条目 8 个字段的集合需要 3 分钟才能到达控制器。只需 1 或 2 个条目花费很少的时间。我所知道的唯一一件事就是将数据绑定到模型视图。我不知道 MVC2 是否提供了一种简单的方法来发送这么多数据并绑定它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2021-12-20
        • 1970-01-01
        相关资源
        最近更新 更多