每个</form>一个<form>

时间:2013-08-26 16:52:39

标签: html asp.net-mvc-3

我们正在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的使用,我们也需要这样做。

2 个答案:

答案 0 :(得分:1)

如果您的应用程序仅用于在现代浏览器中运行,则可以使用HTML5 form attribute。它允许您将控件与form元素相关联,即使控件不在HTML标记中的form元素内也是如此。所以你可以例如在包含提交按钮的单元格内使用form标记,并在其他控件中使用form,这些控件在功能上属于同一表单。

答案 1 :(得分:0)

好吧,我一直在玩它,似乎在<tr>内包装<form>确实产生了预期的表单提交行为,即使它不是严格的Kosher HTML,至少我测试的浏览器样本相对较窄。我怀疑将此与Jukka结合使用控件上的form属性可以为任何浏览器提供一些帮助,这些浏览器将DOM破坏到不起作用的程度。

我认为现在这样做;它只是一个内部使用的应用程序,而其他所有替代方案都需要愚蠢的Javascript特技,甚至是愚蠢的CSS特技,或者损害整体用户体验。

也许如果我们都开始这样做,W3C和浏览器制造商将决定应该完全支持。 ;)