0

我是 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)]我只希望在我的表单上按下按钮时触发上面的索引操作 。这是可能的,还是我走错了路?

4

1 回答 1

2

由于评论有帮助,我将添加作为未来访问者的答案......

我不禁注意到您正在寻找的关键输入之一是返回键。根据form和的 HTML 的input设置方式,返回键也可能导致formPOST 正常。所以本质上:

  • JavaScript 代码正在调用 POST 到BarcodeScan操作
  • HTMLform正在调用该Index操作的 POST

前者的结果被浏览器忽略,因为页面正在被重新加载。但无论结果如何,仍会调用该操作。

有几种方法可以解决这个问题:

  • 如果有一个submit输入您只是用作按钮,您可以将其更改为 abutton并保留没有 a 的表单submit。这适用于仅应由 JavaScript 驱动且没有默认 POST 操作的表单,但如果不了解更多信息,很难判断这是否适用于此。
  • JavaScript 代码可以通过调用preventDefault(). 大多数 jQuery 函数都有一个事件参数,您可以在事件上调用该函数。这将告诉 DOM 结束事件,因此它不会“冒泡”到表单、文档等。
于 2013-08-15T21:13:06.107 回答