表单编码Javascript int []未被模型Binder拾取

时间:2012-06-13 15:03:46

标签: javascript jquery asp.net-mvc asp.net-mvc-4

昨晚我试图把我从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[],是一个空数组。

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

1 个答案:

答案 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'
        });