2012-06-13 83 views
3

昨晚我试着把自从MVC2以来一直工作的东西放在一起。Form Encoded Javascript int [] not Binding Model Binder

考虑下面的类:

public class RouteSaveViewModel 
{ 
    public string Title { get; set; } 
    public string Comments { get; set; } 
    public string DepartureDate { get; set; } 
    public string ArrivalDate { get; set; } 
    public List<int> LocationIds { get; set; } 
} 

...以下动作:

[HttpPost] 
    public ViewResult SaveRoute(RouteSaveViewModel route) 
    { 
     // yada yada 
     return SomethingShiny(); 
    } 

我想用$就或$。员额在数据传递。该表格是多步骤收集用户的数据并提交。我用它来构建位置标识了该代码是这样的:

 var routeStopIds = []; 
     $(".route-stop").each(function(){ 
      routeStopIds.push($(this).attr('data-id')); 
     }); 

我已经证实没有我预期的ID是该数组中,通过在浏览器的开发工具和小提琴手。最后,提交数据,我映射出物体正如我在以前的MVC所做的构建:

 $.ajax({ 
      type: 'post', 
      url: postUrl, 
      data: { 
       Title: $("#route-title").val(), 
       Comments: $("#route-description").val(), 
       DepartureDate: depDate, 
       ArrivalDate: arrDate, 
       LocationIds: routeStopIds      
      }, 
      dataType: 'JSON' 
     }); 

我所看到的是,所有数据 - 除了LocationIds参数是填充。我也尝试将routeStopIds阵列提交给修改后的SaveRoute,该修改只接受List<int>,但似乎并不奏效。无论哪种方式,LocationIds都为空,尽管请求中的表单参数中存在表单编码值。

{LocationIds%5b%5d=44&LocationIds%5b%5d=4&LocationIds%5b%5d=2} 

...,但该HttpValueCollection只是LocationIds[],空数组。

那么,我错过了一些明显的东西?也许不那么明显?如何通过模型绑定获取数组?

回答

4

请记住,我说我从MVC2开始工作的部分?啊,这是在这里: Advanced Model Binding在该文章中,我明确提到了以下几点:

注:为了使在ASP.NET MVC的 约束机制兼容数组的结果(如MVC 2.0 )我们需要在$ .ajax()中使用 '传统'设置。

修改ajax调用以包含此设置是修复。雨和柔软的羊毛小猫都是正确的。或手套或其他。

 $.ajax({ 
      type: 'post', 
      url: postUrl, 
      traditional: true, // <----- here be kittens 
      data: { 

       Title: $("#route-title").val(), 
       Comments: $("#route-description").val(), 
       DepartureDate: depDate, 
       ArrivalDate: arrDate, 
       LocationIds: routeStopIds 
      }, 
      dataType: 'JSON' 
     });