3

昨晚我试图整理自 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 传递数据。该表单是从用户那里收集数据并提交的多步骤。我用来构建位置 ID 的代码是这样的:

        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参数之外的所有数据都已填充。我还尝试仅将数组提交给仅接受 a并且似乎也不起作用routeStopIds的修改后的数组。无论哪种方式,都为空,尽管请求的表单参数中有一个表单编码值。SaveRouteList<int>LocationIds

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

...然而 HttpValueCollection 只是LocationIds[]一个空数组。

那么,我是否遗漏了一些明显的东西?也许不那么明显?如何让模型绑定获取数组?

4

1 回答 1

4

还记得我说过我从 MVC2 开始就让它工作的那部分吗?是的,就是在这里: 高级模型绑定 在那篇文章中我明确提到了以下内容:

注意:为了使数组的结果与 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'
        });
于 2012-06-13T15:03:46.090 回答