Dot-Net
404 - 在控制器 Y 上找不到公共操作方法 X(ActionInvoker.InvokeAction 返回 false)
這不是一個重複的問題,這個問題讓我發瘋。我收到典型錯誤“在控制器 Y 上找不到公共操作方法 X”,它返回一個
404 Not Found. 截圖給你一個好主意:
該圖顯示調試器在執行引發異常的行之前暫停(
base.HandleUnknownAction(actionName))。現在,在你下結論之前,這裡有一些資訊:
- 這在某些時候工作得非常好。
- HTTP 動詞 (
GET) 應該被UpdateCart操作接受(參見方法簽名上面的註釋)。- 發送的參數無關緊要:錯誤發生在
POST,GET和任何參數組合。- 同一控制器中的其他類似操作執行良好。
- 我截取了帶有
UpdateCart標記的螢幕截圖virtual,但刪除virtual沒有任何區別。- 螢幕截圖顯示
ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")返回 false。不知道為什麼在我的控制器上執行的反射找不到方法,但它就在那裡!這些路由是預設路由並且它們可以工作,否則我將無法停止調試器以獲取上面的螢幕截圖。這是來自的程式碼
Global.asax.cs:public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Tickets", action = "Index", id = UrlParameter.Optional } ); }任何想法都非常感謝。
編輯
Ethan Brown 在下面的回答是正確的:
HttpGet並且HttpPost是相互排斥的。解決方案是將這些屬性替換為[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)].
問題是您同時指定了
HttpGet和HttpPost屬性。如果您將它們都關閉,則該操作同時接受 POST 和 GET 請求。我的猜測是HttpGetandHttpPost屬性不會向 MVC 發出信號以允許相應的請求類型,而是拒絕相反的類型。因此,通過 include[HttpPost],您拒絕了 GET 請求,通過 include[HttpGet],您拒絕了 POST 請求……實際上拒絕了所有請求類型。關閉屬性,它將接受這兩種類型。更新:我剛剛檢查了 MVC 源,我的假設是正確的。在
ActionMethodSelector中,它因此檢查屬性:if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) { matchesWithSelectionAttributes.Add(methodInfo); }換句話說,所有
ActionMethodSelectorAttribute(從中HttpPostAttribute和HttpGetAttribute派生)都必須返回 true 才能呼叫操作。一個或另一個總是會返回 false,因此該操作將永遠不會執行。
