2011-02-13 40 views
0

大家晚上好。我目前使用MVC 3,我有一个viewmodel包含属性是一个列表。我目前使用json2的JSON.stringify方法将我的viewmodel传递给我的操作方法。在调试过程中,我注意到所有简单的属性都经过了,但是集合属性是空的,即使我知道集合中至少有一个对象。我想知道是否有人遇到同样的问题。下面是代码,我使用后的操作方法:asp.net mvc 3 ViewModel收藏属性,以json不工作

$.post("/ReservationWizard/AddVehicleToReservation/", 
     JSON.stringify('@ViewData["modelAsJSON"]'), 
     function (data) { 
      if (data != null) { 
       $("#vehicle-selection-container").html(data); 
       $(".reservation-wizard-step").fadeIn(); 
      } 
     }); 

对象@ViewData["modelAsJSON"]包含以下JSON和传递到我的操作方法 {"NumberOfVehicles":1,"VehiclesToService":[{"VehicleMakeId":0,"VehicleModelId":0}]}

正如你所看到的财产“VehiclesToService “有一个对象,但是当它到达我的操作方法时,它不会被转换为集合中的对应对象,而是集合是空的。

如果有人对此问题有任何了解,将不胜感激。

在此先感谢。

UPDATE作出修改建议,使调用new JavaScriptSerializer().Serialize(@Model)此之后

确定的是,最终得到通过邮局发送到我的行动方法的字符串 '{"NumberOfVehicles":1,"VehiclesToService":[{"VehicleMakeId":0,"VehicleModelId":0}]}'

我可以调试,看到了发送到我的操作方法的对象,但同样的收集属性是空的,我知道集合中至少有一个对象。

的AddVehicleToReservation动作方法的声明如下: public ActionResult AddVehicleToReservation(VehicleSelection selections) { ... return PartialView("viewName", model); }

+0

'AddVehicleToReservation`方法是怎么样的? – 2011-02-13 20:29:08

回答

1

这里的问题:

JSON.stringify('@ViewData["modelAsJSON"]') 

JSON.stringify是一个客户端功能,您传递的参数中所储存的ViewData的这样一个清单我想它最终会打电话给.ToString(),而你有

JSON.stringify('System.Collections.Generic.List<Foo>') 

在你的最终HTML中显然没有多大意义。另外不要忘记,为了使用$ .post函数将参数传递给服务器,第二个参数需要是一个JavaScript对象,它不是JSON.stringify所做的(它会生成一个字符串)。所以你需要用这样的HTML来结束:

$.post(
    'ReservationWizard/AddVehicleToReservation', 
    [ { id: 1, title: 'title 1' }, { id: 2, title: 'title 2' } ], 
    function (data) { 
     if (data != null) { 
      $('#vehicle-selection-container').html(data); 
      $('.reservation-wizard-step').fadeIn(); 
     } 
    } 
); 

所以要做到这一点,你首先需要将这个ViewData序列化为JSON。您可以使用JavaScriptSerializer类这样的:

@{ 
    var myList = new JavaScriptSerializer().Serialize(ViewData["modelAsJSON"]); 
} 
$.post(
    '@Url.Action("AddVehicleToReservation", "ReservationWizard")', 
    // Don't use JSON.stringify: that makes JSON request and without 
    // proper content type header your sever won't be able to bind it 
    @myList, 
    function (data) { 
     if (data != null) { 
      $('#vehicle-selection-container').html(data); 
      $('.reservation-wizard-step').fadeIn(); 
     } 
    } 
); 

请不要使用此ViewData。使您的视图强烈键入并使用视图模型。