我有一个特定的控制器动作被调用两次,除了奇怪之外导致我的应用程序的单个部分出现问题(不是真正的问题,它只是引起我的双重调用)。
知道为什么控制器动作每次都要执行两次吗?
答案 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调用不再发生。
答案 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 扩展程序,如果有人遇到此问题,请确保您对浏览器的隐身模式进行了测试!