【发布时间】:2018-01-06 10:30:15
【问题描述】:
我正在循环浏览我的模型的 IEnumerable:
@model IEnumerable<Testing.Models.ProductItem>
@{
ViewBag.Title = "Buy Products";
}
<div class="row">
@foreach (var product in Model)
{
using (Html.BeginForm())
{
@Html.HiddenFor(Model => product)
... More Controls and stuff...
<input type="submit" value="Add To Kart" class="btn btn-info">
}
}
</div>
在提交时,我想将选定的模型实例传回我的控制器:
[HttpPost]
public ActionResult Index(ProductItem product)
{
... Do Stuff ...
return View();
}
但是我尝试了一些事情,但似乎总是将 null 传递到控制器中...请有人帮我指出正确的方向吗?
编辑
我实际上不需要完整的模型实例,因为我可以从 ID 在控制器中获取它 - 所以我尝试了以下方法:
@model IEnumerable<Testing.Models.ProductItem>
@{
ViewBag.Title = "Buy Products";
}
<div class="row">
@foreach (var product in Model)
{
using (Html.BeginForm())
{
@Html.HiddenFor(Model => product.ID)
@Html.TextBox("qty", "1", htmlAttributes: new { @style = "width: 30px;" })
... More Controls and stuff...
<input type="submit" value="Add To Kart" class="btn btn-info">
}
}
</div>
向控制器发帖:
[HttpPost]
public ActionResult Index([Bind(Include = "ID")] int? ID, [Bind(Include = "qty")] int? qty)
{
return null;
}
文本框不是模型的一部分,因为它是用户输入 - 这个值很好地传递给了 actions 参数,但是我仍然在 HiddenFor 控件中得到一个空值。这与控件的命名有关吗?我似乎无法为 HiddenFor 控件添加名称。
我知道这对最初的问题有不同的看法,但我希望你仍然能够提供帮助。
我注意到 BeginForm 在循环内 - 为列表中的每个项目创建...有没有一个简单的替代方法(注意我还没有尝试过任何东西)。
【问题讨论】:
-
您的代码存在多个问题。首先,您不能将复杂对象绑定到表单控件(如果是模型,则需要绑定每个属性)。并且为集合中的每个项目设置一个表单是没有意义的 - 您一次只能提交一个表单,并且在任何情况下您都会生成与您的模型无关的输入
-
要么使用
for循环或EditorTemplate在单个表单中生成表单控件,然后在一个操作中提交所有内容(请参阅this answer),或者如果您只想更新一个项目有一次,使用 ajax 或有一个链接将您重定向到一个页面以编辑该项目 -
谢谢...鉴于此,我已将问题更新为传递 ID 而不是完整模型。如果您能够看一下并让我知道您现在的想法会很棒。
-
你需要阅读之前的cmets和我给你的链接。您的视图没有意义,并且您使用
name="product.ID", but your model does not contain a complex property namedproduct` 生成控件(您的方法中的参数也没有)。你应该删除那些无意义的[Bind]属性
标签: c# asp.net-mvc submit