Asp.net mvc 在MVC3Razor视图中,当布局需要嵌套表单时,如何发布到不同的操作?

Asp.net mvc 在MVC3Razor视图中,当布局需要嵌套表单时,如何发布到不同的操作?,asp.net-mvc,asp.net-mvc-3,razor,nested-forms,Asp.net Mvc,Asp.net Mvc 3,Razor,Nested Forms,使用我的一些MVC3Razor视图,我发现需要嵌套表单,这是不可能的(HTML中不允许) 有一个表单,针对一个特定的操作,它包含一个表。但在某些/所有/一个特定的表行中,我需要针对一个单独的操作。例如: @using (Html.BeginForm("EditPersons")) { <table> <tr> <th>Name</th> <th>Age</th

使用我的一些MVC3Razor视图,我发现需要嵌套表单,这是不可能的(HTML中不允许)

有一个表单,针对一个特定的操作,它包含一个表。但在某些/所有/一个特定的表行中,我需要针对一个单独的操作。例如:

@using (Html.BeginForm("EditPersons"))
{
    <table>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
        @for (int i=0; i < Model.Persons.Count; i++)
        {
            <tr>
                <td>@Html.TextBox(...)</td>
                <td>@Html.TextBox(...)</td>
            </tr>
        }
            <tr>
                <td></td>
                <td>
                    @using (Html.BeginForm("AddPerson")
                    {
                        <input type="submit" value="Add person" />
                    }
                </td>
            </tr>
    </table>
}
@使用(Html.BeginForm(“编辑人员”))
{
名称
年龄
@对于(int i=0;i
现在,我可以明显地将“AddPerson”按钮放在整个表的下面,但是如何使它与第二个表列对齐呢

此外,我可以让“添加人员”按钮在隐藏字段中放置一些“命令”,并让编辑人员操作检查是否应该添加人员或为现有人员保存更新的数据,但我觉得这在某种程度上会打破单一用途操作的范例(与可怕的老式ASP“发布到自身”表单相反)


那么,我该如何解决这个问题呢?

我目前正在做类似的事情。我将要执行的操作存储在输入元素中

<input type="submit" value="Add person" data-action"/AddPerson">


然后,通过订阅单击或表单提交,使用将表单更改为数据操作。

仅供参考,在表格中放置表单标记(即,环绕tr标记)是不合法的HTML。它在某些(大多数?)中有效浏览器,但不能保证它会工作,也不能保证移动浏览器会支持它

那么,问你如何做一些无效的事情来避免做其他同样无效的事情,到底有什么意义呢

正确的方法是将表包装成一个表单。然后,在每一行上使用提交按钮,但给每一行一个稍有不同的id,例如“submit_1”,然后找出哪个行按钮被单击,哪个按钮出现在发布的值中

其他可能性是在单击按钮时执行JavaScript:

<input type="button" onclick="SubmitMyForm(15)" /> 

如果您有一个名为SubmitMyForm的方法,它为行编号(或您想要使用的任何其他标识符)获取一个参数,那么您可能会使用jquery提取一个数据属性值来标识行

最后,在表的底部,您可以调用不同的方法,例如“AddPerson”,该方法将修改表单的操作属性,然后调用form.submit()并将其发布到不同的操作。不过老实说,在大多数情况下,您不需要为此发布。您可以使用重定向到新页面的链接


在任何情况下,您都不需要嵌套表单(无效),即使在表单中包装tr是合法的(无效)。

不清楚您试图通过这些表单实现什么……我认为应该只有一个表单:编辑或创建-哪一个表单应该决定您的服务器(或客户端)但是,如果您真的需要两个“嵌套”表单,您可以考虑使用jQuery .Ajax方法< /P> < p>调用动作。我不知道您需要2个窗体,以及为什么需要使用服务器端技术。

我确信有人能够找到使用asp.NETMVC技术的解决方案,但就我而言,javascript可以轻而易举地做到这一点。 所以,在提交整个表单之前,您希望能够向服务器发送一些值,或者您希望部分表单工作不同而不是整体。这很好。无论是JavaScript还是您的语言,请考虑对代码的这些更改(使用jQuery):

@使用(Html.BeginForm(“编辑人员”))
{
名称
年龄
@对于(int i=0;i
如果您单击add person按钮,它将向服务器端发送POST请求,FormCollection对象将只有一个键,即collection[“field”]。我调用的操作(AddPerson)是ActionToHandleController。另一方面,如果您单击submit按钮,您将调用EditPerson(我猜是这样)人事控制员。 好了,在两个不同的位置(控制器)执行两个不同的操作。形式相同。
此示例只是冰山一角。这是ASP.NET MVC的一个重要功能。您具有更大的灵活性,并且并非所有内容都必须作为服务器端脚本处理。

是否添加人员button必须提交表单?它可以只是一个链接吗?你依赖于用户的一些输入值吗?它需要传递用户所属的所有者对象的id。为了简洁起见,从示例代码中省略。id当然可以放在HTTP-GET查询字符串中。实际上可能更简单:客户端脚本可以简单地添加一个新的table行表示一个新人。当我将整个表单发布到EditPerson时,服务器将创建一个新人。可能在这种情况下。我的错误。我已编辑了我的问题,因此示例代码中的第二个表单现在位于最后一个表单中。但仍然不允许嵌套表单,因此它仍然是无效的HTML:-)我的问题是试图把重点放在我可能需要一整张桌子来解决的问题上
@using (Html.BeginForm("EditPersons"))
{
    <table>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
        @for (int i=0; i < Model.Persons.Count; i++)
        {
            <tr>
                <td>@Html.TextBox(...)</td>
                <td>@Html.TextBox(...)</td>
            </tr>
        }

        <tr>
            <td><input type="text" id="field" name="field"/></td>
            <td>
                <input type="button" id="btnAddPerson" value="Add person" />
            </td>
        </tr>
        <tr><td colspan="2"><input type="submit" value="send the whole thing" /></td></tr>

 }
 <script>
    $(document).ready(function(){
        $("#btnAddPerson").click(function(event){
            event.stopPropagation();
            $.post("/actionTohandle/addperson", { person : $("#field").val()}, function(data){
                //do something with the result
            })
        })
    })
 </script>