【发布时间】:2022-04-20 11:21:03
【问题描述】:
我正在上这些课程:
public class ProductViewModel
{
public IEnumerable<Product> Products { get; set; }
}
public class Product
{
public int ArticeNr { get; set; }
public string Name { get; set; }
}
还有这个观点
@model ProductsViewModel
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<table class="table">
@foreach (var item in Model.Products) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.ArticleNr)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
</tr>
}
</table>
<input type="submit" value="submit" name="submitButton" />
}
如何将我的所有值从 Model.Products 传递到控制器?我希望将 foreach 循环中的所有值发送到控制器
我的控制器将 ProductsViewModel 作为参数。但是我在model.Products 发帖后的值是空的。
public ActionResult Index(ProductsViewModel model) //here, model.Products is always null after post
{
//LOGIC
}
【问题讨论】:
-
DisplayFor()不会为回发创建输入。您需要使用生成<input>或<select>元素的方法,例如EditorFor()、TextBoxFor()、HiddenFor().... -
@StephenMuecke 感谢您的回答。我试图在我的 foreach 循环中的每个属性上设置一个 HiddenFor() ,但在 postBack 到控制器上仍然是 null 。我错过了什么?
-
您没有正确构建循环。你需要
for(int i = 0; i < Model.Projects.Count; i++) { @Html.HiddenFor(m => m.Projects[i].Name) ..。但是你到底为什么要发回一大堆隐藏的输入? -
从性能的角度来看,从数据库中再次获取集合通常总是会更好,尽管我不确定为什么在保存模型时需要再次获取集合跨度>
-
为了性能,我建议您使用 AJAX (jquery
$.get()函数将值传递给操作方法,该方法调用数据库根据值过滤结果( s) 并返回可以在视图中更新的局部视图 - 即您不需要重建整个页面。
标签: c# asp.net-mvc asp.net-mvc-5