我是MVC的新手,这个问题一直困扰着我。当用户按下选项卡或在我的表单上的文本框中输入密钥时,我有一些javascript触发jquery ajax帖子:
<script type="text/javascript">
$(document).ready(function () {
$('#RmaNumber, #SerialNumber').keydown(function (event) {
if (event.keyCode == 13 || event.keyCode == 9) {
var ri = {
RmaNumber: $('#RmaNumber').val(),
SerialNumber: $('#SerialNumber').val(),
ControlName: event.target.id
}
$.ajax({
type: "POST",
url: "/Invoice/BarcodeScan",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(ri),
dataType: "json",
success: function (data) {
$('#TerminalType').text(data.TerminalType);
}
});
}
});
});
</script>
这是我的控制器的样子。我删除了代码以保持简单:
public ActionResult Index()
{
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(RepairInvoice ri)
{
}
[HttpPost]
public ActionResult BarcodeScan(string RmaNumber, string SerialNumber, string ControlName)
{
}
ajax回发导致BarcodeScan和Index操作都会触发。如果在表单上按下按钮,我只希望触发上面有[AcceptVerbs(HttpVerbs.Post)]
的索引操作。这可能吗,还是我走错了路?
答案 0 :(得分:2)
由于评论有所帮助,我将为未来的访问者添加答案......
我不禁注意到,您正在寻找的其中一个关键输入是返回键。根据{{1}}和form
的HTML设置方式,返回键也可能导致input
正常POST。基本上是这样的:
form
操作BarcodeScan
正在调用form
操作前者的结果被浏览器忽略,因为页面正在完整地重新加载。但无论结果如何,仍然会调用该动作。
有几种方法可以解决这个问题:
Index
输入只是一个按钮,则可以将其更改为submit
,并保留不带button
的表单。这适用于应该仅由JavaScript驱动且没有默认POST操作的表单,但很难判断这是否适用于此而不知道更多。preventDefault()
中停止DOM事件。大多数jQuery函数都有一个事件参数,你可以在事件上调用该函数。这将告诉DOM结束事件,因此它不会“冒泡”到表单,文档等。