Jquery 使用$.ajax提交表单是否相互矛盾?

Jquery 使用$.ajax提交表单是否相互矛盾?,jquery,html,asp.net-mvc,ajax,Jquery,Html,Asp.net Mvc,Ajax,我目前正在开发一个MVC应用程序,其中我使用了很多jQuery和html表单。然而,最近我注意到这些似乎相互矛盾 例如,我必须阻止表单默认提交来处理我的AJAX调用,否则服务器会被调用两次,这让我怀疑使用AJAX提交表单的想法。将$.ajax调用挂接到而不是不是更好吗 那么,通过ajax提交表单是矛盾的吗?我不会说这是“矛盾的”。在通过ajax提交表单时,当然不需要使用元素,但出于语义目的,您可能仍然希望使用一个元素 是的,我只想使用而不是type=“submit”,因为这样您就必须阻止默认表单

我目前正在开发一个MVC应用程序,其中我使用了很多jQuery和html表单。然而,最近我注意到这些似乎相互矛盾

例如,我必须阻止表单默认提交来处理我的AJAX调用,否则服务器会被调用两次,这让我怀疑使用AJAX提交表单的想法。将
$.ajax
调用挂接到
而不是
不是更好吗

那么,通过ajax提交表单是矛盾的吗?

我不会说这是“矛盾的”。在通过ajax提交表单时,当然不需要使用
元素,但出于语义目的,您可能仍然希望使用一个元素

是的,我只想使用
而不是
type=“submit”
,因为这样您就必须阻止默认表单提交。

我不这么认为

当用户没有启用javascript时,您可以将其设置为回退,以便将表单提交到服务器,并且用户仍然可以使用您的网页

为此,您的后端需要知道它是否是ajax调用。
我看到您正在使用jQuery,jQuery ajax发送一个标题
x\u request\u with:xmlhttprequest
,如果您在后端使用PHP,您可以在
$\u服务器['http\u x\u request\u with']

中将ajax调用放在submit按钮上的原因是,如果用户禁用了javascript,就会出现自然的回退。您应该让后端逻辑检测请求是ajax请求还是直接提交,如果是ajax,则可以将数据发送回,如果不是,则可以采用“老派”方式处理请求

编辑:用于上下文

<form action="/processForm.php" method="POST">
   <input type="submit" value="submit" />
</form>
如果用户禁用了javascript,表单将像正常情况一样提交到/processForm.php

您可以通过以下php检测表单是否是通过ajax发送的(我不知道您使用的是否是ajax,但这是我得到的)


这取决于你想做什么。 一般来说,我试着使用,然后处理
使用$.ajax()进行的调用。。。但有时,asp.NETMVC无法实现这一点。例如,如果正在上载文件,asp.net验证将阻塞。为了解决这个问题,我使用ajaxForm插件包装了一个标准表单。

你说的“矛盾”是什么意思?你觉得什么是矛盾的?我觉得通过提交过程和ajax过程提交表单是矛盾的,因为默认提交总是优先的,除非你在进行ajax调用之前阻止默认提交。如果你的客户端支持ajax,是否需要强迫他们往返到服务器进行访问获取整个新页面只是为了显示感谢信息或检查某些内容的状态?我自己会使用AJAX提交数据,并根据我的使用情况取回HTML或JSON。除非您在表单提交中使用默认值,否则您将获得重复提交。其思想是编写代码,使其优雅地降级。您可以绑定到表单提交,检查是否启用了AJAX,以及它是否为preventDefault,然后执行AJAX。我如何将其作为自然回退实现,目前我必须阻止该操作,以便AJAX优先,这意味着没有回退。可以提供一个例子吗?如果用户没有启用JavaScript,那么阻止标准表单提交的JS将不会启动。所以你真的不需要做任何事情。要检测是否启用了AJAX:$.support.AJAX,完整的例子是$('#categoryFilter').submit(函数(事件){if($.support.AJAX){event.preventDefault();/*将我的AJAX放在这里*/});
$('form').bind('submit', function(e){
    e.preventDefault();
    //do your stuff
});
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  /* handle ajax here */
}else{
  /* handle normal submit here */
}