ASP.net MVC和jQuery将多个表单序列化为对象列表并提交

时间:2011-03-31 15:53:46

标签: c# jquery asp.net-mvc asp.net-mvc-3

使用asp.net mvc3和jquery

我在页面上有x个表单,每个表单在用户添加新项目时创建。每个表单代表c#中的模型。每个表单都有一个字符串列表作为其中一个属性。我想要一个提交所有表单的全部保存按钮,但是我希望在我这样做之前将它们序列化为一个对象列表,然后在后端对其进行排序。我怎么能用jQuery做到这一点?

<form>
    <input name="ListThing" value="one" />
    <input name="ListThing" value="two" />
    <input name="ListThing" value="three" />
    <input name="Name" value="Bob" />
</form>

<form>
    <input name="ListThing" value="one" />
    <input name="ListThing" value="two" />
    <input name="ListThing" value="three" />
    <input name="Name" value="Pat" />
</form>

C#

public class myModel{
    public List<string> ListThing {get; set;}
    public string Name {get; set;}
}

controller - UploadController -action

[HttpPost]
public ActionResult SaveAll( List<myModel> myModels )
{
    // do stuff
    return View();
}

2 个答案:

答案 0 :(得分:7)

您不能拥有多个具有相同ID的元素。首先修复你的标记:

<form>
    <input name="ListThing" value="one" />
    <input name="ListThing" value="two" />
    <input name="ListThing" value="three" />
    <input name="Name" value="Bob" />
</form>

<form>
    <input name="ListThing" value="one" />
    <input name="ListThing" value="two" />
    <input name="ListThing" value="three" />
    <input name="Name" value="Pat" />
</form>

然后假设您有一些链接来触发操作:

@Html.ActionLink("Save all", "SaveAll", "Home", null, new { id = "saveall" })

你可以简单地AJAX化它:

$('#saveall').click(function () {
    var data = $('form').map(function () {
        var $form = $(this);
        return {
            name: $form.find(':input[name=Name]').val(),
            listThing: $form.find(':input[name=ListThing]').map(function () {
                return $(this).val();
            }).toArray()
        };
    }).toArray();

    $.ajax({
        url: this.href,
        type: 'post',
        contentType: 'application/json',
        data: JSON.stringify({ myModels: data }),
        success: function (result) {
            alert('done');
        }
    });

    return false;
});

答案 1 :(得分:2)

Darin的解决方案有效,但我个人会使用http://www.malsup.com/jquery/form/对表单进行Ajax化,而无需手动进行映射。 ASP.Net MVC的Default Binder将绑定多个具有相同名称的元素(或带有顺序“[X]”索引器的同名)作为List。