Jquery 将表单元素更改为其他元素或将其删除,同时保留所有子元素

Jquery 将表单元素更改为其他元素或将其删除,同时保留所有子元素,jquery,dom-manipulation,Jquery,Dom Manipulation,我已经将Asp.net MVC与Sharepoint站点集成。它工作得很好。但我也在使用默认的Sharepoint母版页(~masterurl/default.master)。问题在于,此特定母版页将整个页面包装在表单元素中,而所有Sharepoint页面都只是普通的Asp.net Web表单页面 我的MVC内容应该有自己的表单和我想提交给服务器的输入元素。Ajax调用显然没有问题。如果保留原始的form元素,则无法使用$(“form”).serializeArray()。但尽管如此,正常的回发

我已经将Asp.net MVC与Sharepoint站点集成。它工作得很好。但我也在使用默认的Sharepoint母版页(
~masterurl/default.master
)。问题在于,此特定母版页将整个页面包装在
表单
元素中,而所有Sharepoint页面都只是普通的Asp.net Web表单页面

我的MVC内容应该有自己的
表单
和我想提交给服务器的输入元素。Ajax调用显然没有问题。如果保留原始的
form
元素,则无法使用
$(“form”).serializeArray()
。但尽管如此,正常的回发还是有问题的,因为提交事件上有WebForm功能,它们会向服务器发送太多数据

我将使用普通回发和Ajax回发。主要问题是普通回发

因此,我有两种可能都应该在
$(document.ready()
)上运行:

  • 删除表单元素并保持所有其他内容不变。在jQuery中,它可能意味着在
    表单
    元素前面加上
    div
    ,将其内容移动到此div,然后删除
    表单
  • 直接将
    form
    元素更改为
    div
    。这在浏览器处理方面可能会更快,但我不知道怎么做
  • 因此,如果有人能详细说明2的解决方案。并就这两种可能的解决方案提供一些意见:应该做哪一种以及为什么

    编辑 还有第三种可能性。我可以根据需要创建输入元素,但将它们包含在
    div
    元素中。当用户想要提交我的表单时(
    div
    无论如何都不是表单),我可以:

  • 动态调用
    $(“div.form”).serializeArray()
  • 创建表单元素
  • 用序列化的值填充它
  • 将表单附加到正文
  • 提交它
  • 看起来很乏味,但它可以工作。前两个解决方案似乎更简单。

    如果您是通过提交,我会直接使用其中的元素,如下所示:

    $.ajax({
      url: "Path/Action",
      type: "post",
      data: $("#someContainer :input").serialize(),
      success: function(data) {
        //do something
      }
    });
    
    或较短的版本:


    这不需要任何
    生成或其他技巧,只需要一个普通的jQuery AJAX帖子(或
    获取
    ,无论需要什么)。

    你不需要
    来发送AJAX帖子,你是用jQuery还是MVC生成的表单发布的吗?@Nick:这就是我说的“AJAX调用显然没有那么大问题”的意思。我严格使用jQuery for Ajax。但是像
    $(“form”).serializeArray()
    这样的操作仍然会有问题,因为我不能使用它。你可以在一组元素上调用
    .serialize()
    ,这是我的观点:),例如
    $(“#mycontainer:input”).serialize()
    :@Nick:Good point。谢谢我编辑了我的问题,这是进行Ajax回发的方法。这里的主要问题当然是定期回发。这里还有另一个问题:如果定期回发某些Sharepoint功能(因为它出现在我的页面上是因为母版页),该怎么办?我添加的输入元素会扰乱Sharepoint内部流程吗?@Robert-不会,只要名称是唯一的……它就不会关心它们。那么定期回发呢?@Robert-我想回到为什么您需要这两个元素的问题上……在什么情况下,您希望定期回发而不是ajax回发?如果重定向是您唯一的动机,那么您可以在回调中这样做,总体来说可能更简单。老实说,把东西塞进SharePoint并不是100%干净的……我们所能做的就是让它尽可能干净。
    $.post("Path/Action", $("#someContainer :input").serialize(), function(data) {
      //do something
    });