ASP.NET MVC Action被称为两次

时间:2009-11-17 19:43:35

标签: asp.net-mvc

我有一个特定的控制器动作被调用两次,除了奇怪之外导致我的应用程序的单个部分出现问题(不是真正的问题,它只是引起我的双重调用)。

知道为什么控制器动作每次都要执行两次吗?

15 个答案:

答案 0 :(得分:25)

在通过AJAX进行调用的链接上的JavaScript单击处理程序中,不返回false或阻止对事件的默认操作。在这种情况下,它还将采用链接的默认操作(即,非AJAX帖子到同一URL)。

实施例

<%= Html.ActionLink( "action", "controller" ) %>


$(function() {
   $('a').on('click', function(e) {
      // solve with "e.preventDefault();" here
      var href = $(this).attr('href');
      $.get(href, function() { ... });
      // or solve with "return false;" here to prevent double request
   });
}):

答案 1 :(得分:12)

我有类似的问题。问题是由我的_Layout.cshtml文件中的这一行引起的:

<link rel="shortcut icon" href="">

删除上述行后,我的操作会被调用一次。

答案 2 :(得分:7)

很晚但我发现

<img id="myLogo" src="#"/> 

导致它再次进行呼叫。希望这有助于某人,我不确定的原因。

在这里找到解决方案。     http://skonakanchi.blogspot.com/2011/09/action-method-calling-twice-in-aspnet.html

答案 3 :(得分:6)

这也很晚,但也许这对某人有帮助。

我的问题很相似(控制器方法会在初始加载时触发一次,然后会异步地再次触发)。

我能够检查HttpContext.request对象,并确定第二个请求是由Visual Studio的“浏览器链接”功能引起的。

我禁用了浏览器链接,而且我的控制器方法的神秘ajax调用不再发生。

How to disable Browser Link

答案 4 :(得分:1)

在我的具体情况下,加载jquery.unobtrusive-ajax.min.js文件两次。这导致了 $(document).ready(function() { });函数要执行两次。

希望这有用。

答案 5 :(得分:1)

使用kendo网格发生了这个问题。使用网格选项 AutoBind(false) ..

答案 6 :(得分:0)

从视图中删除null able参数

public ActionResult Edit(int? id)

public ActionResult Edit(int id)

答案 7 :(得分:0)

我的问题是我不小心将recaptcha/api.js文件格式包含在谷歌两次中。一个在BaseLayout中,另一个在视图中。

答案 8 :(得分:0)

我有一个类似的问题。问题是由部分view.cshtml文件中的以下行引起的:

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

删除后已修复。

答案 9 :(得分:0)

在我的控制器中,方法A调用方法B。很明显,它们被调用了两次。我通过写入输出窗口验证了这一点。有趣的是,它说:

Method A was called.
Method A was called.
Method B was called. 
Method B was called.

我本来希望A,B,A,B。而且,尽管多次打电话,我只收到了XHR.statusText回传一次。我知道,因为该文本会自动添加到浏览器中的表中。

无论如何,该问题与jquery.form.js有关。我用它来启用AJAX文件上传。

文档说,在$(document).ready()期间初始化jquery.form.js与HTML表单的连接时,可以添加一个名为“ url”的选项。如果不这样做,则默认为表单的ACTION。

我依靠默认值,并且接到了两次电话。

当我添加url选项并将ACTION从表单标记中删除时,问题消失了。

答案 10 :(得分:0)

我分享了我的经验,以防有人为我服务,

一个提交按钮

<button type="submit" class="gb-btn-outline-primary margin-top-s" id="btnProcess">
   <i class="fas fa-play margin-right-xs"></i> Procesar
 </button>

他称之为以下Javascript函数

$(function () {
            $('#btnProcess').click(function (e) {
                var plantID = $("#plantID option:selected").val();                    
           if (plantID == "" || plantID == null || plantID == 0) {
                showMessage("2", "Seleccione la planta");
                e.preventDefault();
            }else{
                    var plant = $('#plantID option:selected').text();
                    $("#PlantName").val(plant);
                    var unit = $('#UnitID option:selected').text();
                    $("#UnitName").val(unit);
                    $("#remakeAudit").val(false);
                    $("#frmSearch").submit();
            }
            });
        });

我遇到的问题是由于单击函数,我两次调用了该动作 并在这一行中提交-> $(“#frmSearch”)。submit();

该问题的解决方案是避免使用click函数默认情况下的事件 e.preventDefault();

通过以下方式:

   $(function () {
        $('#btnProcess').click(function (e) {
         e.preventDefault(); //<<---
         var plantID = $("#plantID option:selected").val();                    
        if (plantID == "" || plantID == null || plantID == 0) {
            showMessage("2", "Seleccione la planta");
            e.preventDefault();
        }else{
                var plant = $('#plantID option:selected').text();
                $("#PlantName").val(plant);
                var unit = $('#UnitID option:selected').text();
                $("#UnitName").val(unit);
                $("#remakeAudit").val(false);
                $("#frmSearch").submit();
        }
        });
    });

答案 11 :(得分:0)

就我而言,我只需要在操作上添加[HttpPost]即可解决问题。

答案 12 :(得分:0)

就我而言,我在同一视图文档中有两次具有相同ID的 html元素。请检查您的html页面(或查看页面)是否具有相同的id属性,并清除相同的id名称。

答案 13 :(得分:0)

就我而言,我注意到每次开始输入URL时,浏览器都会预加载页面。当我按下Enter键时,它将再次被调用。解决方案就是简单地检查它是否正在运行,然后阻止该方法的调用。

答案 14 :(得分:0)

就我而言,这是因为“AdBlock”chrome 扩展程序,如果有人遇到此问题,请确保您对浏览器的隐身模式进行了测试!