我有一个从ActionLink调用中被调用两次的控制器。
我的主页有一个链接,单击该链接会调用Play控制器上的Index方法。 id为100传递给方法。我认为这是造成这个问题的原因。更多内容如下。
以下是一些代码段:
主页:
<%= Html.ActionLink("Click Me", "Index", "Play", new { id = 100 }, null) %>
播放控制器:
public ActionResult Index(int? id)
{
var settings = new Dictionary<string, string>();
settings.Add("Id", id.ToString());
ViewData["InitParams"] = settings.ToInitParams();
return View();
}
播放视图:
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
(html <head> omitted for brevity)
<body>
<form id="form1" runat="server" style="height:100%">
Hello
</form>
</body>
如果我摆脱了Index方法的参数,一切都很好。如果我保留参数,则调用Index方法,并将100作为id。返回View后,第二次调用该方法,参数为null。
我似乎无法弄清楚是什么触发了第二次通话。
我的第一个想法是添加这样的特定路线:
routes.MapRoute(
"Play", // Route name
"Play/{id}", // URL with parameters
new {controller = "Play", action = "Index"} // Parameter defaults
);
除了制作更漂亮的链接外,这没什么效果。
我不知道从哪里开始。
答案 0 :(得分:62)
是否有其他标记可能会意外引用该页面?脚本引用,图像引用,css引用都可能被错误地指向'。'或当前页面。
答案 1 :(得分:5)
10 hours chasing that bug in a Java Spring Maven project.
First on SELECT I thought Hibernate was just logging twice, but then with INSERT I thought requests were called twice. Stepping throught the code I discovered controller was called twice...
Tried all possible Spring configuration, thinking the context was loaded twice or a bean was instantiate twice...
In despair, rebuilded the project piece by piece to finally add a fragment of HTML and kaboom bug's back.
<img alt="" src="#" />
The sharp sign was guilty, reloading the URL. I know the topic is old, but I summarized my searchs with the words I used to look for in vain on Internet to find an answer to the same issue! Could help others...
答案 2 :(得分:3)
您可以在视图中单步执行代码。逐步查看第二个来电的来源。
答案 3 :(得分:2)
调试时我发现部分视图会导致第二次调用Controller。它很糟糕,但我看不到那个工作。
答案 4 :(得分:2)
应该有一个无效的html营销。 请检查所有的img tage。 还检查
<link rel="icon" href="favicon.ico" type="image/x-icon" />
答案 5 :(得分:1)
您也可以尝试更改此路线。
routes.MapRoute(
"Play", // Route name
"Play/{id}", // URL with parameters
new { controller = "Play", action = "Index" , id = "" } // Parameter defaults
);
答案 6 :(得分:1)
它很旧,但有人会需要它。我的问题是 style="background-image: url(../)
。让我们找到关于这种风格的 html、css 代码
答案 7 :(得分:1)
我做的非常愚蠢...在页面上有2个表单,每个表单上有一个按钮。我添加了脚本以根据单击的按钮提交特定表单但是,由于表单上按钮的默认操作是进行提交,因此它将控制器操作称为两次。 :^(
$('#SaveButton').click(function (event) {
$("#AttendanceDetailForm").submit();
});
答案 8 :(得分:1)
尝试将int? id
更改为int id
。它是第二次匹配路由,因为你再次使用null id调用索引。
答案 9 :(得分:0)
通过确保我没有双重引用我的JavaScript
文件来解决我的问题。
当我点击链接时,这导致动作被击中两次。
我知道上面已经说过了,但我想我会指出,检查你的文件是否被加载两次是值得的,特别是如果你使用的是Partial Views
。
我注意到在我的一个Partial Views
中,我告诉它使用主布局页面,其中包含负责我点击链接时发生的事情的脚本。所以我通过设置layout = null;
来解决这个问题,因为无论如何它都是局部视图,并且已经被加载到主布局中。
答案 10 :(得分:0)
我遇到了同样的问题并验证了所有可能的建议,但没有运气,我注意到我的控制台中出现了JS警告消息。
主线程上的同步XMLHttpRequest由于其不推荐使用 对最终用户的体验产生不利影响。如需更多帮助,请检查 https://xhr.spec.whatwg.org/
xmlHttp = new XMLHttpRequest();
我纠正了这个并且对我有用。
注意所有 js错误和警告消息。
这对某人有帮助。
答案 11 :(得分:0)
就我而言,我使用的是部分视图(因此没有Form标签),并在JQuery中使用on click处理程序通过Ajax调用控制器中的方法。但是我已经将处理程序附加的按钮声明为Submit类型。我忘了将e传递给我的处理函数,以便调用e.PreventDefault()!!所以Controller方法被调用了两次 - 一次来自ajax调用,一次来自Submit。参数第二次为空。这让我非常悲痛。这么小的一件事。这么小,很容易被忽视。希望这有助于其他人。
答案 12 :(得分:0)
我也面临同样的问题。在彻底检查了我的项目后,我发现没有这样的空参考案例。 然后我发现它是由FireBug引起的。 禁用firebug或使用未安装firebug的其他浏览器解决了这个问题。
答案 13 :(得分:0)
在我的情况下,它是错误配置的远程脚本Yandex.metrika(谷歌分析模拟)。此脚本显示在每个页面上,因此任何控制器和任何操作都被调用两次。检查您的Ya.metrika设置以获取更多详细信息。
答案 14 :(得分:0)
这是一个古老的问题,有些答案仍然有用。这就是为什么我要添加一个新答案,希望对其他人有所帮助。对我来说,我有一个应用程序可以在域之间来回重定向用户。由于我最近与HttpCookie相关的一些工作,我添加了以下代码行:
httpCookieObject.SameSite = SameSiteMode.Strict;
结果证明SameSiteMode.Strict在跨域身份验证方案方面引起问题。这是关于它的Microsoft文档: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2
严格执行以下网站的同一站点政策: SameSiteMode.Strict,设置MinimumSameSitePolicy。虽然这个 设置会破坏OAuth2和其他跨域身份验证方案, 它提高了其他类型应用程序的Cookie安全级别 不要依赖跨域请求处理。
所以,我的解决方案是我不使用SameSiteMode.Strict策略,我很好。
答案 15 :(得分:0)
我正在追问我的问题,并在这里找到了它:
<div style="width: 200px; height: 200px; background-image: url('\Asd\image.jpg')"></div>
出现了问题,并且问题变成了\
字符,因此在服务器端代码中,我用\
替换了所有/
,并且起到了作用。
答案 16 :(得分:0)
我也有同样的问题。我的问题是因为我在浏览器中安装了一个插件。
查看浏览器中的加载项。
答案 17 :(得分:0)
我的视图和 _Layout.cshtml 中有相同的脚本引用。删除任一地方的引用解决了问题
@Scripts.Render("~/bundles/jqueryval")