繁体   English   中英

MVC controller 被调用两次

[英]MVC controller is being called twice

我有一个 controller 从 ActionLink 调用中被调用两次。

我的主页有一个链接,单击该链接时会调用 Play controller 上的 Index 方法。 将 100 的 id 传递给该方法。 我认为这是导致问题的原因。 更多关于这下面。

以下是一些代码片段:

主页:

<%= Html.ActionLink("Click Me", "Index", "Play", new { id = 100 }, null) %>

播放 Controller:

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 方法的参数,一切都很好。 如果我将参数保留在原位,则使用 100 作为 id 调用 Index 方法。 返回View后,第二次调用该方法,参数为null。

我似乎无法弄清楚是什么触发了第二次通话。

我的第一个想法是添加这样的特定路线:

routes.MapRoute(
    "Play", // Route name
    "Play/{id}", // URL with parameters
    new {controller = "Play", action = "Index"} // Parameter defaults
);

除了使链接看起来更漂亮之外,这没有任何作用。

我不确定 go 从这里到哪里。

是否有任何其他标记可能会意外引用该页面? 脚本引用、图像引用、css 引用,都可能被错误地指向“.”。 或当前页面。

在 Java Spring Maven 项目中追逐该错误 10 个小时。

首先在 SELECT 上,我认为 Hibernate 只是记录了两次,但是对于 INSERT,我认为请求被调用了两次。 单步执行我发现控制器被调用两次的代码......

尝试了所有可能的 Spring 配置,认为上下文被加载了两次或者一个 bean 被实例化了两次......

无奈之下,把项目一点一点的重建,最后加了一段HTML和kaboom bug的背影。

<img alt="" src="#" />

尖锐的标志是有罪的,重新加载了 URL。 我知道这个话题很老,但我用我以前在互联网上徒劳地寻找的词来总结我的搜索,以找到同一问题的答案! 可以帮助别人...

您可以单步执行视图中的代码。 逐步查看第二个呼叫的来源。

在调试时,我发现部分视图会导致控制器第二次被调用。 这很糟糕,但我没有看到解决这个问题的方法。

应该有一个无法正常工作的 html 标记。 请检查所有 img 标签。 还检查

<link rel="icon" href="favicon.ico" type="image/x-icon" />

尝试改变int? id int? idint id 它第二次匹配路由,因为您再次使用空 ID 调用索引。

您也可以尝试将您的路线更改为此。

routes.MapRoute( 
    "Play", // Route name 
    "Play/{id}", // URL with parameters 
    new { controller = "Play", action = "Index" , id = "" } // Parameter defaults 
);

我遇到了同样的问题并验证了所有可能的建议,但没有运气,然后我注意到控制台中出现了以下 JS 警告消息。

主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。 如需更多帮助,请查看https://xhr.spec.whatwg.org/

 xmlHttp = new XMLHttpRequest();

我纠正了这一点,它对我有用。

注意所有js 错误警告消息

这可能对某人有所帮助。

我做了一些非常愚蠢的事情......在一个页面上有 2 个表单,每个表单上有一个按钮。 我添加了脚本以根据单击的按钮提交特定表单,但是,由于表单上按钮的默认操作是提交,因此它两次调用了我的控制器操作。 :^(

    $('#SaveButton').click(function (event) {
        $("#AttendanceDetailForm").submit();
    });

它很旧,但有人会需要它。 我的问题是style="background-image: url(../) 。让我们找到关于这种风格的 html, css 代码

我也面临同样的问题。 在彻底检查我的项目后,我没有发现这样的空参考案例。 然后我发现它是由FireBug引起的。 禁用萤火虫或使用其他没有安装萤火虫的浏览器解决了这个问题。

通过确保我没有重复引用我的JavaScript文件,我的问题得到了解决。

当我单击链接时,这导致操作被击中两次。

我知道之前已经说过以上内容,但我想我会指出,检查您的文件是否被加载两次是值得的,尤其是在您使用Partial Views

我注意到在我的Partial Views之一中,我告诉它使用主布局页面,其中包含负责单击链接时发生的事情的脚本。 所以我通过设置layout = null;解决这个问题layout = null; 因为无论如何它都是局部视图并且已经在主布局内加载。

就我而言,我使用的是局部视图(因此没有表单标签)并使用 JQuery 中的点击处理程序通过 Ajax 调用控制器中的方法。 但是我已将处理程序附加到的按钮声明为类型 Submit。 我忘了将 e 传递给我的处理程序函数以便调用 e.PreventDefault() !! 所以 Controller 方法被调用了两次 - 一次来自 ajax 调用,一次用于提交。 参数的第二次为空。 这让我非常伤心。 这么小的事情。 太小了,很容易被忽视。 希望这对其他人有帮助。

就我而言,它是错误配置的远程脚本 Yandex.metrika(Google 分析模拟)。 这个脚本出现在每个页面上,所以任何控制器和任何动作都会被调用两次。 检查您的 Ya.metrika 设置以了解更多详细信息。

这是一个老问题,有些答案仍然有用。 这就是为什么我要添加一个新答案,希望能对其他人有所帮助。 对我来说,我有一个应用程序可以在我的域之间来回重定向用户。 由于我最近的一些 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 策略,我很高兴。

我正在追寻我的问题并在这里找到它:

<div style="width: 200px; height: 200px; background-image: url('\\Asd\\image.jpg')"></div>和问题使\\字符所以在服务器端代码中我替换了所有\\ /它正在发挥魅力。

我也有同样的问题。 我的问题是因为我在浏览器中安装了一个附加组件。

在浏览器中查看加载项。

我的视图和 _Layout.cshtml 中有相同的脚本引用。 删除任一地方的引用解决了问题

@Scripts.Render("~/bundles/jqueryval")

我正在使用 ASP.NET MVC 并遇到了同样的问题。 在我的 _Layout.cshtml 中,有一个已弃用的标签“bgsound”。 通过用“audio”替换“bgsound”解决了这个问题。 我认为一些不推荐使用的标签可能会导致同样的问题。

据我所知,这个问题可能有三个主要原因。

  1. 您从客户端调用了两次 controller function。 这意味着:新请求 => 新 Scope => 新 Controller 实例。 因此,控制器构造函数中的调试标记应该提示第二次调用。

  2. 您从中间件调用了两次。

  class Middleware: IMiddleware {  
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        await next(context); //call #1
        await next(context); //call #2
        //This is tricky... base calls might also call the controller function, and those are easily overlooked!
        await base.InvokeAsync(HttpContext context, RequestDelegate next);
    }
  }

  1. 您从 controller 本身调用了两次:
  class SomeController: Controller {  
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
      await next();//call #1
      await next();//call #2
      //And again... tricky... base calls might also call the controller function, and those are easily overlooked!
      await base.OnActionExecutionAsync(context, next);
    }
  }

但是,这个问题可能有更多的原因,我只是暂时没有考虑。 在同一请求中指示第二次调用的最简单方法是在第一次调用结束时继续“进入”。 您将在某个时候自动结束第二次通话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM