我有一个对象模型,我将它传递给视图,以便用户可以作为调查的一部分输入他们对某些对象属性的注释。
如果我只将一个对象渲染到视图中,我就能够接收用户为对象输入的内容。但是,当我想向视图呈现多个(列表)对象时,当用户单击提交表单时,我会收到一个空对象列表。
请参阅下面的代码:
这是我的对象模型
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">
}
&#13;
这是我的HttpPost方法
[HttpPost]
public ActionResult Survey(List<Models.SurveyViewModel> model)
{
...
}
当用户点击“提交”按钮时,我得到的模型为null,我希望看到一个列表。
请让我知道我做错了什么。
感谢您的帮助。
答案 0 :(得分:0)
通常,您无法在默认模型装订器中将对象列表发布到控制器。
最佳解决方案只能基于Index传递对象以在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();
}