gpt4 book ai didi

c# - ASP.Net MVC3 模型绑定(bind) IEnumerable 与编辑器模板

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:53 24 4
gpt4 key购买 nike

<分区>

所有,请澄清我对模型绑定(bind)如何与 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="" />
....

但是,在我的 Controller 中,我似乎无法接收到模型(绑定(bind))的返回值。

[HttpPost]
public ActionResult Approve(Approve approveModel)
{
.... approveModel has all default values
}

有人可以阐明我在这里做错了什么吗?我缩写了代码,我将编辑器模板与模型中的其他 EditorFor 和 HiddenFor 字段一起使用...

已编辑:我基本上有一个表格布局,每个布局都有用户名,一个文本框,我可以在其中输入他们的角色(用户或管理员),然后是一个提交给我的 Controller 的批准按钮。因此我只想返回一个 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>
}

然后将 Controller 更改为

[HttpPost]
public ActionResult Approve(IEnumerable<Approve> approvals)
{
// ???????????????????????
}

现在我仍然不清楚如何知道我为哪一行点击了 Approve。我知道还有其他方法可以完成此任务(创建一个复选框用于批准,并批准任何选中的内容等)但是,我需要能够单击一个按钮并只将 1 行保存回数据库,无论用户是否输入信息到其他行。将我的 IEnumerable 包装在它自己的模型(即 AllApprovals)中,然后将辅助属性添加到该父模型(SelectedIndex 等)是否更好?如果这是采用的方法,那么如何在单击“批准”按钮后设置 SelectedIndex?这仍然是 jquery 魔法还是有正确的 MVC 方法来完成这个? Jquery 魔法对我来说似乎很老套?

编辑:根据 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>
}

Controller

[HttpPost]
public ActionResult Approve([Bind(Prefix="approval")]Approve approval) {
// WORKS!
}

24 4 0