使用HttpPost将对象列表从View传递给控制器

时间:2016-07-28 10:19:10

标签: c# asp.net-mvc

我正在努力将对象列表从视图传递给C#代码。如果我传递一个简单的字符串,它工作正常。但它不适用于List。所以我相信我在这里遗漏了一些东西。

查看

<div class="row control-actions">
@{
    List<MyObject> test = ViewBag.ObjectsList;
    <button type="button" class="btn btn-primary btn-wide" onclick="addAllObjectsToExp('@test')">Add All</button>
            }
</div>

<script type="text/javascript">

function addAllObjectsToExp(objList) {
    $.post('@Url.Action("AddAllObjectsToExp", "ExportObjects")', { objectsList: objList},
    function (result) {
        $('#numbers').html(result);
    });
}
</script>

代码

[HttpPost]
[OutputCache(Location = System.Web.UI.OutputCacheLocation.None, NoStore = false, Duration = 0)]
public int AddAllObjectsToExp(List<MyObject> objectsList)
{
    foreach(MyObject obj in objectList)
    {
        //Do something here
    }

    //and return an integer
}

调试时我可以看到@test变量已经填充了MyObject列表。但是当我到达代码端时,它总是为空。

如果我在这里遗漏了什么,请告诉我。如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

您正在将C#对象传递给Javascript函数。它不知道如何阅读。在传入之前,您应该将其序列化为JSON。

如果你使用Json.NET,你可以通过

来完成
ViewBag.ObjectsList = JsonConvert.SerializeObject(yourlist);

然后你可以像往常一样继续。

有些说明:

您应该尝试开始使用ViewModels而不是将内容放入ViewBag中。在Javascript方面,您应该绑定事件处理程序,例如点击而不是使用onclick,因为它会使您的代码更易于管理和重用。