2010-07-09 75 views
6

我recieving以下錯誤消息,Asp.Net MVC:執行子請求失敗。請檢查的InnerException瞭解更多信息

公共行動方法「RenderMenu」 沒有在控制器 「Web.Controllers.SiteController」找到。

然而,這個行動確實存在,並且控制器確實存在(因爲它在網站上到處都有),我看着內部異常。

執行子請求失敗。 請檢查InnerException的 更多信息。

(這是內部異常...)

堆棧跟蹤

在 System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap [TResult](Func`1 FUNC )at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler,TextWriter writer,Boolean preserveForm,Boolean setPreviousPage, VirtualPath path,VirtualPath 文件路徑,字符串physPath,異常 錯誤,字符串queryStringOverride)

現在,我們有一個網站設置了一個動態的菜單系統,所以我們的通用控制器上使用的RenderAction()來建立這個菜單系統啓動。

<% Html.RenderAction("RenderMenu", "Site"); %> 

該呼叫從母版製作,直到有像這樣驗證錯誤,它工作正常,

[HttpPost] 
     public ActionResult Register(UserModel UserToAdd) 
     { 
      if(!ModelState.IsValid) 
      { 
       return View(UserToAdd); 
      } 
      //Run some validation 
      if (_UserService.DoesEmailExist(UserToAdd.EMail)) 
      { 
       TempData["error"] = "Email Address Already in use!"; 
       return View(UserToAdd); 
      } 

      //Add the user 

      TempData["info"] = "User Added - " + UserO.ID; 
      return View("Success"); 
     } 

它正常工作時,這是一個新的用戶,但如果有人進入已經存在的電子郵件,我們得到上述錯誤。這RenderAction方法遍佈整個網站(這是我們添加的第一種形式)

有什麼建議嗎?

+0

嗯...你不應該使用RenderAction。我知道這很好,但以此來看,你的觀點會採取行動。因此你沒有正確的流程。 什麼是正確的解決方案是,在「基本」控制器中有一個代碼,將MenuModel作爲Lazy添加到ViewData中。和RenderPartial(「MenuView」,ViewData [「MenuModel」]) – cRichter 2010-07-09 11:08:24

回答

8

修正:

的的RenderAction()方法如下

 [HttpGet] 
     public ActionResult RenderMenu() 
     { 
      //Do Stuff 
     } 

卸下HTTPGET屬性已經解決了這個問題。

 public ActionResult RenderMenu() 
     { 
      //Do Stuff 
     } 

想知道爲什麼嗎?

+4

因爲如果你有Get屬性,它只會允許獲取請求。但是如果有帖子請求,它不能找到該方法。 我認爲,如果它的成功,你重定向到另一個動作(與get),但是當它失敗時,它應該顯示發佈請求,因此搜索接受發佈的菜單方法。 – cRichter 2010-07-09 11:17:31

+0

@cRichter - 謝謝:) – LiamB 2010-07-09 11:22:47

+0

@cRichter打我吧:) – Andrew 2010-07-09 12:08:18

-1

這是因爲您的父請求是[HttpPost],並且子請求的操作與父代相同。如果您的方法被標記爲[HttpGet],它將不會響應[HttpPost]請求。直接通過您的瀏覽器執行操作,因爲這是一個GET。在POST的背景下將該行爲作爲子動作進行操作將不起作用。