.NET MVC - 一次提交多个相同类型的模型

时间:2011-08-18 16:11:23

标签: asp.net-mvc-3

我认为我有一个非常简单的场景,但似乎无法掌握如何在.NET的MVC框架中做到这一点。最简单的是,这是一种具有排名的人。我想在一个页面上列出他们名字旁边的每个人的姓名和文本框。这是(Razor)Html的样子:

@using (Html.BeginForm()) {
<fieldset>
    @foreach (var b in Model.Ballots) {
        <p>
            <label>@b.Person.FullName</label>
            @Html.TextBox("Rank")
            @Html.ValidationMessage("Rank")
        </p>
    }
</fieldset>
 <input type="submit" value="Vote" />

}

选票是一个简单的对象,有一个人和一个排名:

public class Ballot {
    public Person Person { get; set; }
    [Range(1, 6, ErrorMessage="The voting range is 1 through 6")]
    public int Rank { get; set; }
}

这是我的控制器处理表单提交的方法,但它永远不会被调用。

[AcceptVerbs("POST")]
    public ActionResult Vote(IEnumerable<Ballot> ballots) {

        return View("BallotComplete");
    }

如何迭代表单提交回服务器的所有模型?

1 个答案:

答案 0 :(得分:7)

我使用Customer对象做了一个快速示例,但我认为它类似。请注意表单字段的标签方式。以控制器中的参数名称作为前缀。需要索引作为集合处理。你的可能会稍微复杂一点,因为你有一个嵌套的类。 (选票内的人)。我认为通过做客户[@counter] .Person.Id表单字段可以工作。对不起,我没有选票的例子。 :)

这将是视图的相关部分:

@using (Html.BeginForm())
{
    var counter = 0;
    foreach (var customer in this.Model)
     {
         <input type="text" name="customers[@counter].Id" value="@customer.Id"/>
         <input type="text" name="customers[@counter].CompanyName" value="@customer.CompanyName"/>
         counter++;
     }
     <input type="submit" />
}

这将是控制器的相关部分:

public ActionResult Test()
{
    return View(Service.GetCustomers());
}

[HttpPost]
public ActionResult Test(Customer[] customers )
{
    return View(customers);
}