【发布时间】:2013-08-29 05:38:15
【问题描述】:
我们正在 MVC3 中构建一个应用程序,并且我们希望拥有可编辑的数据表。我们所追求的是这样的(略有删节):
<table class="project-items data-grid">
foreach (var item in Model.Items) {
using (Html.BeginForm("SaveItem", "Project", FormMethod.Post)) {
<tr>
<td>@Html.TextBox("Title", item.Title) @Html.Hidden("ProjectID", proj.ProjectID) @Html.Hidden("ItemID", item.ItemID)</td>
<td>@Html.DropDownList("State", item.State.ToSelectList(), "")</td>
<td>@Html.DropDownList("QuoteID", Model.Quotes.ToSelectList(item.QuoteID), "")</td>
<td>@Html.TextBox("EstimatedCost", item.EstimatedCost, new { @class = "costfield" })</td>
<td>@Html.TextBox("VendorEstimatedCost", item.VendorEstimatedCost, new { @class = "costfield" })</td>
<td>@Html.TextBox("VendorQuotedCost", item.VendorQuotedCost, new { @class = "costfield" })</td>
<td><input type="submit" value="Save" name="Save"/></td>
</tr>
}
}
</table>
当然,将<form> 直接放在<table> 中不是有效的HTML;它似乎在某些情况下可以工作,但在其他情况下,它会完全吓坏浏览器和/或模型绑定器。
什么是最安全、最干净的方法来做到这一点,这样我们就不会依赖未定义的行为?我想要一些适合有或没有 AJAX 的表单的东西。我尝试过使用<div> 和display: table-cell 技巧,但这阻止了colspan 的使用,我们也需要这样做。
【问题讨论】:
-
您是否考虑过使用 KendoUI 可编辑网格?
-
对Create a HTML table where each TR is a FORM 的回答包含两种可以结合使用的方法:在整个表格周围放置一个表单以使其在没有 JS 的情况下工作,在可能的情况下使用 JS 仅提交当前行。
-
我试图避免将整个表格包装在一种形式中,因为我们最终不得不做特技来保持控件名称的唯一性,并在操作方法中将它们解析出来(可能比我们现在做的将表单输入直接绑定到操作方法参数要优雅得多)。
标签: html asp.net-mvc-3