Ajax帖子导致2个动作运行

时间:2013-08-15 20:49:10

标签: c# asp.net-mvc asp.net-mvc-4

我是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)]的索引操作。这可能吗,还是我走错了路?

1 个答案:

答案 0 :(得分:2)

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

我不禁注意到,您正在寻找的其中一个关键输入是返回键。根据{{​​1}}和form的HTML设置方式,返回键也可能导致input正常POST。基本上是这样的:

  • JavaScript代码正在调用form操作
  • 的POST
  • HTML BarcodeScan正在调用form操作
  • 的POST

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

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

  • 如果您输入的Index输入只是一个按钮,则可以将其更改为submit,并保留不带button的表单。这适用于应该仅由JavaScript驱动且没有默认POST操作的表单,但很难判断这是否适用于此而不知道更多。
  • JavaScript代码可以在其跟踪by calling preventDefault()中停止DOM事件。大多数jQuery函数都有一个事件参数,你可以在事件上调用该函数。这将告诉DOM结束事件,因此它不会“冒泡”到表单,文档等。