【发布时间】:2011-10-20 05:31:52
【问题描述】:
所有,请澄清我对模型绑定如何与 IEnumerables 和编辑器模板一起使用的困惑。
我有一个看法,Approve.cshtml
@model IEnumerable<MvcWebsite.Models.Approve>
<table>
<tr>
<th>
Name
</th>
</tr>
@Html.EditorForModel()
</table>
模型,Approve.cs
public class Approve
{
public string Name { get;set;}
public string Role { get; set; }
}
还有一个编辑器模板
@model MvcWebsite.Models.Approve
@using (Html.BeginForm("Approve", "Registration", FormMethod.Post))
{
<tr>
<td>
@Html.HiddenFor(m => m.Name)
@Html.EditorFor(m => m.Role)
</td>
<td>
<input type="submit" value="Approve" class="submit-button" />
</td>
</tr>
}
这一切都很好。它呈现以下输出。
<input name="[0].Name" type="hidden" value="" />
....
但是,在我的控制器中,我似乎无法接收模型返回的值(绑定)。
[HttpPost]
public ActionResult Approve(Approve approveModel)
{
.... approveModel has all default values
}
有人可以阐明我在这里做错了什么吗?我缩写了代码,我将编辑器模板与模型中的其他 EditorFor 和 HiddenFor 字段一起使用...
已编辑:我基本上有一个表格布局,每个都有用户名,一个文本框,我可以在其中输入他们的角色(用户或管理员),然后是一个提交给我的控制器的批准按钮。因此,我只想返回一个 Approve 对象。我可以将整个 IEnumerable 返回给我的 Controller,但如果这样做,我如何知道哪些项目是我单击“批准”按钮(提交)的项目?
编辑: 所以我修改了代码,以便我有一个围绕整个 View Approve.cshtml 的表单
@model IEnumerable<MvcWebsite.Models.Approve>
@using (Html.BeginForm("Approve", "Program", FormMethod.Post))
{
<table>
<tr>
<th>
Name
</th>
</tr>
@Html.EditorForModel()
</table>
}
然后把控制器改成
[HttpPost]
public ActionResult Approve(IEnumerable<Approve> approvals)
{
// ???????????????????????
}
现在我仍然不清楚如何知道我为哪一行点击了批准。我知道还有其他方法可以完成此任务(为批准创建一个复选框,并批准任何已检查的内容等)但是,我需要能够单击一个按钮并且只将 1 行保存回数据库,无论用户是否输入信息到其他行。将我的 IEnumerable 包装在它自己的模型(即 AllApprovals)中,然后将辅助属性添加到该父模型(SelectedIndex 等)是更好的做法吗?如果这是要采取的方法,那么在单击“批准”按钮后如何设置 SelectedIndex?那仍然是 jquery 魔术还是有正确的 MVC 方法来实现这一点? Jquery 魔法对我来说似乎很 hackish?
编辑:根据 Brian 的回复,这是我的最终结果。仍然感觉不太对劲,但它确实有效!
查看
@model IEnumerable<MvcWebsite.Models.Approve>
<table>
<tr>
<th>
Name
</th>
</tr>
@Html.EditorForModel()
</table>
编辑器模板
@using (Html.BeginForm("Approve", "Registration", FormMethod.Post))
{
<tr>
<td>
@Html.HiddenFor(m => m.Name)
@Html.EditorFor(m => m.Role)
</td>
<td>
<input type="submit" value="Approve" class="submit-button" />
</td>
</tr>
}
控制器
[HttpPost]
public ActionResult Approve([Bind(Prefix="approval")]Approve approval) {
// WORKS!
}
【问题讨论】:
标签: c# asp.net-mvc-3 binding model controller