簡體   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