MVC控制器被调用两次

时间:2010-05-01 18:43:49

标签: asp.net-mvc asp.net-mvc-2

我有一个从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
);

除了制作更漂亮的链接外,这没什么效果。

我不知道从哪里开始。

18 个答案:

答案 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")