具有相同ViewModel类型的两个参数的MVC Controller无法正确绑定

时间:2015-08-12 20:46:16

标签: ajax asp.net-mvc asp.net-mvc-4

我有以下控制器操作:

public JsonResult AcceptChanges(RoomPricing currentData, RoomPricing lastSaveData)
{
...
}

该控制器从我的AJAX请求中接收JSON编码对象:

$.ajax(
{
    type: "POST",
    url: _controllerURL,
    data: JSON.stringify({ currentData: _currentData, lastSaveData: _lastSaveData }),
    ...
});

AJAX请求数据来自我的局部视图中的表单,该表单使用类型为RoomPricing的ViewModel。 Current和lastSave数据分别是表单的更新和过时序列化版本。这些对象的目的是在服务器端执行表单更新检查。服务器端,因为RoomPricing模型包含一个可枚举的垃圾和其他垃圾,这些垃圾会使可靠的更新检查变得复杂并且令人讨厌地执行客户端。

现在,当控制器接收到currentData和lastSaveData时,它会自动创建RoomPricing对象,但两个对象都是相同的,具有currentData的值。需要说明的是:lastSaveData是创建的,但仅限于名称,因为它的内容与currentData的内容相同(因此忽略了AJAX传递的数据,我假设它进入虚空)。

我希望这种行为是MVC试图对模型绑定有所帮助的副作用。有没有人建议解决这个问题?使用两个RoomPricing对象作为控制器参数创建超级ViewModel并不能解决此问题。

提前致谢!

编辑:当前和lastSave数据来自以下JQuery代码:

var $lastSaveFormData = null;
    function AjaxSubmitForm() {
        var $lastSaveSerialized = ($lastSaveFormData == null ? null : $lastSaveFormData)

        var $form = $('#MyForm');

        submitOverrideForm(
            $form.serialize(),      // currentData
            $lastSaveSerialized,    // lastSaveData
            $form.attr('action'),
            );

        $lastSaveFormData = $form.serialize();
    }

通过以上内容,我可以记录自上次保存以来的所有更改。虽然模型有点复杂,但发送数据的大小非常小,所以我想我要比较数据服务器端,我们就是这样。最后要注意的是,我已经验证了此时 - JSON.stringify({ currentData: _currentData, lastSaveData: _lastSaveData } - 编码数据符合预期...如果发生表单更新,currentData和lastSaveData是唯一的。

编辑:我刚才注意到了别的东西。以下是发送到服务器的数据以及服务器端在绑定到模型之前接收的数据:

_currentData,@ AJAX call:

  

“书%5B0%5D.Author = 1&安培;图书%5B0%5D.Title = 100安培;图书%5B0%5D.IsPaperback =假安培;图书%5B1%5D.Author = 2及预订%5B1%5D。标题= 2222 &安培;图书%5B1%5D.IsPaperback =假“

_lastSaveData @ AJAX call:

  

“书%5B0%5D.Author = 1&安培;图书%5B0%5D.Title = 100安培;图书%5B0%5D.IsPaperback =假安培;图书%5B1%5D.Author = 2及预订%5B1%5D。标题= 77 &安培;图书%5B1%5D.IsPaperback =假“

JSON收到服务器端,就在模型绑定之前:

  

{“currentData”:“Book [0]。作者:1,1本书[0]。标题:100,100   书[0] .IsPaperback:false,false书[1]。作者:2,2本书[1]。标题:    2222,77 Book [1] .IsPaperback:false,false“,”lastSaveData“:”false“}

就像MVC试图将不同的值绑定到单个模型,实现它不能,并删除'lastSave'数据。然后,当模型击中控制器时,它会发现预期有两个模型,因此它使用这个模型。为什么它会像这样,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您可以添加另一个ViewModel:

public class CurrentAndLastSavedRoomPricingViewModel
{
   RoomPricing CurrentData {get;set;} 
   RoomPricing LastSaveData {get;set;} 
}

并在控制器中获取:

public JsonResult AcceptChanges(CurrentAndLastSavedRoomPricingViewModel data)
{
...
}

使用ajax传递此模型:

$.ajax(
{
    type: "POST",
    url: _controllerURL,
    data: {data: { currentData: _currentData, lastSaveData: _lastSaveData }},
    ...
});

或者您可以从数据库获取服务器上的最后保存数据,但不要从客户端传递。