昨晚我试图把我从MVC2开始工作的东西放在一起。
鉴于以下课程:
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();
}
我想使用$ .ajax或$ .post传递数据。该表单是多步骤的,用于从用户收集数据并提交。我用来构建位置的代码是:
var routeStopIds = [];
$(".route-stop").each(function(){
routeStopIds.push($(this).attr('data-id'));
});
我已经通过浏览器中的开发工具和fiddler验证了我期望的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
param之外。我还尝试仅将routeStopIds
数组提交给仅接受SaveRoute
并且似乎无法正常工作的修改后的List<int>
。无论哪种方式,LocationIds
都为空,尽管请求中的表单参数中存在表单编码值。
{LocationIds%5b%5d=44&LocationIds%5b%5d=4&LocationIds%5b%5d=2}
...然而HttpValueCollection只是LocationIds[]
,是一个空数组。
那么,我错过了一些明显的东西吗?也许不是那么明显?如何通过模型绑定获取数组?
答案 0 :(得分: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'
});