如何在MVC中将对象列表回发到控制器[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个对象模型,我将它传递给视图,以便用户可以作为调查的一部分输入他们对某些对象属性的注释。

如果我只向视图呈现一个单个对象,我能够接收用户为对象输入的内容。但是,当我想向视图呈现多个(一个列表)对象时,当用户单击提交表单时,我会收到一个空对象列表。

请参阅下面的代码:

这是我的对象模型

public class SurveyViewModel
{
    public string Name { get; set; }
    public double PV { get; set; }
    public double QtyUsePerMonth { get; set; }
    public double TotalPVPerMonth { get; set; }
}

这是我查看对象列表的视图

@model IEnumerable<WebApplication4.Models.SurveyViewModel>
@{
    ViewBag.Title = "Survey";
}
<h2>Survey</h2>
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form1" }))
{
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.PV)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.QtyUsePerMonth)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TotalPVPerMonth)
            </th>
            <th></th>
        </tr>

        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                    @Html.HiddenFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.PV)
                    @Html.HiddenFor(modelItem => item.PV)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.QtyUsePerMonth)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.TotalPVPerMonth)
                </td>
            </tr>
        }
    </table>

    <input type="submit" value="Submit">
}

这是我的HttpPost方法

[HttpPost]
public ActionResult Survey(List<Models.SurveyViewModel> model)
{
     ...
}

当用户单击“提交”按钮时,我得到的模型为null,我希望看到一个列表。

请让我知道我做错了什么。

谢谢您的帮助。

asp.net-mvc razorengine
1个回答
0
投票

通常,您无法在默认模型绑定器中将对象列表发布到控制器。

最好的解决方案是你只能根据索引传递对象来在POST中执行CRUD操作,而GET请求你可以得到所有对象列表。所以在POST方法中,只有传递对象才有效。

如果要发布对象列表,可以通过覆盖ModelBinder或使用FormCollection来实现。

这是一个示例,但要执行这种操作方式,我们需要迭代并转换为列表。因为formcollection包含更多项目而不是List类型。由于html帮助,属性的关键因人而异。从formcollection获取值时要注意。

[HttpPost]
public ActionResult Index(FormCollection model)
{
    List<SurveyViewModel> obj = new List<SurveyViewModel>();

    var name =Request.Form["item.Name"].Split(',').ToArray();
    var pv =Request.Form["item.PV"].Split(',').ToArray();

    //length must be same
    for (var i = 0; i < name.Length; i++)
    {
        obj.Add(new SurveyViewModel()
        {
            Name = name[i],
            PV = Convert.ToDouble(pv[i])
        });
    }

    return View();
}
© www.soinside.com 2019 - 2024. All rights reserved.